神はCのチュートリアルソートアルゴリズムのコードを左++

マージソート

//1.内排序,指所有数据已经读入内存,在内存中进行排序的算法。排序过程不需要对磁盘进行读写。
//外排序:内存中无法保存全部数据、需要进行磁盘访问,每次读入部分数据到内存进行排序
//a,merge sort  "分而治之",o(nlogn) 空间o(n)

void merge(vector<int> &array, int left, int mid, int right) {
	vector<int> helper(right - left + 1);
	int i = 0;
	int helperLeft = left;
	int helperRight = mid + 1;

	while (helperLeft <= mid && helperRight <= right) {
		if (array[helperLeft] < array[helperRight]) {
			helper[i++] = array[helperLeft++];
		}
		else {
			helper[i++] = array[helperRight++];
		}
	}
	while (helperLeft <= mid) {
		helper[i++] = array[helperLeft++];
	}
	while (helperRight <= right) {
		helper[i++] = array[helperRight++];
	}
	for (i = 0; i < helper.size(); i++)
		array[left + i] = helper[i];//备份
}
void mergesort(vector<int> &array, int left, int right);
void merge_sort(vector<int> &array) {
	if (array.empty() == true || array.size() < 2) {
		return;
	}
	mergesort(array, 0, array.size() - 1);
}
void mergesort(vector<int> &array, int left, int right) {

	if (left == right) {
		return;
	}
	//分裂和组合:数组被分为左右两部分,两部分进行排序然后合并
	int mid = left + (right - left) / 2;//并不一定是完全相等的两部分.防溢出
	mergesort(array, left, mid);
	mergesort(array, mid + 1, right);
	//将两部分
	merge(array, left, mid, right);

}

バブルソート

//冒泡排序O(N^2)
vector<int> bubble_sort(vector<int>&array) {
	int len = array.size();
	int s;
	if (array.empty() == true || len < 2){
		return array;
	
	}
	for (int i = len-1; i >0; i--) {
		for (int j = 0; j < i; j++) {
			if (array[j] > array[j + 1]) {
				s = array[j];
				array[j ]=array[j+1];
				array[j + 1] = s;
			}
		}
	}
	return array;
}

挿入ソート

//插入排序 
vector<int> insertSort(vector<int> arr) {
	if (arr.empty() == true || arr.size() < 2)
		return arr;
	int s;
	for (int i = 1; i < arr.size(); i++) {
		for (int j = i - 1; j >=0; j--) {
			if (arr[j] > arr[j + 1]) {
				s = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = s;
			}
		}

	}
	return arr;

}

再帰関数は、プロジェクト内に存在することはできませんが、また、ランキング法の非再帰的なバージョンを理解するために

クイックソート最適化されたバージョン

//快速排序 长期期望复杂度 O(N*log(N)) 长期期望空间复杂度 O(logN) 因为断点需要记忆
// 每次递归属于荷兰旗问题  
vector<int> position(vector<int> &arr1,int l ,int r) {

	int less = l - 1;
	int more = r;
	int s;
	while (l < more) {
		if (arr1[l] < arr1[r]) {
			++less;
			s = arr1[less];
			arr1[less]=arr1[l];
			arr1[l] = s;
			l++;
		}
		else if (arr1[l] > arr1[r]) {
			--more;
			s = arr1[more];
		    arr1[more]= arr1[l];
			arr1[l] = s;
		}
		else {
			l++;
		}

	}
	swap(arr1[more], arr1[r]);
	vector<int> p(2);
	p[0] = less + 1;
	p[1] = more;
	
	return p;

}
void quick_Sort(vector<int> &arr1,int l,int r) 
{
	if (l < r) {
		//swap(arr[l + rand() % (r - l)], arr[r]);
		vector<int> p= position(arr1, l, r);//返回的是位置,小于值得右边和大于值得左边
		
		//cout<< p.size()<<endl;
		quick_Sort(arr1,l,p[0]-1);
		quick_Sort(arr1,p[1]+1,r);
	}

}
void quickSort(vector<int> &arr1) {
	if (arr1.empty() == true || arr1.size() < 2)
	{
		return;
	}
	quick_Sort(arr1, 0, arr1.size() - 1);

}

ヒープソート

ヒープ構造

Oの時間複雑(NxlogN)Oの余分なスペースの複雑さ(1)
完全なバイナリツリーに配列した後、配列内の子供の位置:左子供:2 1 + 1、右の子:2 1 + 2
推論の父:( I-1)/ 2;
大ルートスタック:任意の部分木の最大値は、ツリー・ヘッドです。

//建立大根堆的过程
//堆排序
//大根堆生成的时间复杂度O(logN)


void heapInsert(vector<int> &array,int index) {
	while (array[index] > array[(index - 1) / 2]) {
		swap(array[index], array[(index - 1) / 2]);
		index = (index - 1) / 2;
	}

}
//大跟堆中有值发生变化,调整成依旧是大根堆
void heapify(vector<int> &arr, int index, int heapsize) {
	int left = index * 2 + 1;//左孩子节点
	
	while (left < heapsize) {
		int largest;
		if (left + 1 < heapsize&&arr[left + 1] > arr[left])
			largest =left + 1;
		else
			largest = left;
		if (arr[largest]< arr[index]) {
			largest = index;
		}
		if (largest==index)
			break;
		swap(arr[largest],arr[index]);
		index = largest;
		left = index * 2 + 1;
	}
}
void heapsort(vector<int> &arr)
{
	if (arr.empty() == true || arr.size() < 2) {
		return;
	}
	for (int i = 0; i < arr.size(); i++) {
		heapInsert(arr, i);//变成大根堆
	}
	int heaplen = arr.size();
	swap(arr[0],arr[--heaplen]);
	while (heaplen > 0) {
		heapify(arr, 0, heaplen);
		swap(arr[0],arr[--heaplen]);

	}



}

ランダムベクトル生成器

//笔试过程中建立对数器,防止出错
vector<int> generateRandomArray(int maxSize,int maxValue) {
	

	int size = rand() % (maxSize + 1);
	vector<int> arr(size);

	for (int i = 0; i < size; i++) {
		arr[i] = int(rand() % (maxValue + 1)) - int(rand() % (maxValue + 1));
	}
	return arr;

}

同じであるが2に等しいかどうかを決定します

bool isEqual(vector<int> arr1, vector<int> arr2) {
	if ((arr1.empty() == true && arr2.empty() != true) || (arr1.empty() != true && arr2.empty() == true)) {
		return false;
	}
	if (arr1.empty() == true && arr2.empty() == true)
		return true;
	if (arr1.size() != arr2.size())
		return false;
	for (int i = 0; i < arr1.size(); i++) {
		if (arr1[i] != arr2[i]) {
			return false;
		}
	}
	return true;
}

主な機能:対数フィルタであって、

//排序和二分搜索
//#include "stdafx.h"
#include <iostream>
#include <vector>
#include  <stdlib.h>
using namespace std;
void main() {
	int testTime = 500;
	int maxSize = 10;
	int maxValue = 10;
	bool succeed = true;
	for (int i = 0; i < testTime; i++) {
		vector<int> arr1 = generateRandomArray(maxSize, maxValue);
		vector<int> arr2(arr1);
		cout << i << endl;
		//merge_sort(arr1);
		quickSort(arr1);
		arr2=bubble_sort(arr2);

		if (isEqual(arr1, arr2) != true) {
			succeed = false;
			for (int i = 0; i < arr1.size(); i++) {
				cout << arr1[i]<< "";
			}
			for (int i = 0; i < arr1.size(); i++) {
				cout << arr2[i] << "";
			}
			break;
		}
	}
	if (succeed == true){
		cout << "it's right" << endl;
	}
	else {
		cout<<"it's wrong"<<endl;
	}
	system("PAUSE");
	return;
}
公開された12元の記事 ウォンの賞賛0 ビュー431

おすすめ

転載: blog.csdn.net/qq_36523203/article/details/103597861