排序算法(C++)

   日期:2020-09-21     浏览:89    评论:0    
核心提示:详细排序原理可以参考:图文详解—十大经典排序算法1 冒泡排序//冒泡排序void bubbleSort(vector<int> & vec) { int len = vec.size(); for (int i = 0; i < len; i++) { //此处的i是为了界定遍历的长度 for (int j = 0; j < len - i - 1; j++) { if (vec[j] > vec[j + 1]) { int temp =

详细排序原理可以参考:图文详解—十大经典排序算法

1 冒泡排序

//冒泡排序
void bubbleSort(vector<int> & vec) { 
	int len = vec.size();
	for (int i = 0; i < len; i++) { 
		//此处的i是为了界定遍历的长度
		for (int j = 0; j < len - i - 1; j++) { 
			if (vec[j] > vec[j + 1]) { 
				int temp = vec[j];
				vec[j] = vec[j + 1];
				vec[j + 1] = temp;
			}
		}
	}
}

2 选择排序

//选择排序
void selectSort(vector<int>& vec) { 
	int len = vec.size();
	for (int i = 0; i < len; i++) { 
		int maxIndex=0;
		for (int j = 1; j < len - i ; j++) { 
			if (vec[maxIndex] < vec[j]) maxIndex = j;
		}
		int temp = vec[maxIndex];
		vec[maxIndex] = vec[len - i - 1];
		vec[len - i - 1] = temp;
	}
}

3 插入排序

//插入排序
void insertSort(vector<int>& vec) { 
	int len = vec.size();
	for (int j = 1; j < len; j++) { 
		int i, key; 
		key = vec[j];
		for (i = j - 1; i >= 0 && key < vec[i]; i--) { 
			//此时第一个i+1等于j
			vec[i + 1] = vec[i];
		}
		vec[i + 1] = key;
	}
}

4 希尔排序

//希尔排序
void shellSort(vector<int>& vec) { 
	int len = vec.size();
	for (int gap = 5; gap > 0; gap /= 2) { 
		for (int j = gap; j < len; j++) { 
			int i, key = vec[j];
			for (i = j - gap; i >= 0 && key < vec[i]; i -= gap) { 
				vec[i + gap] = vec[i];
			}
			vec[i + gap] = key;
		}
	}
}

5 归并排序

//参考邓俊辉《数据结构》书中归并排序
void merge(int* arr, int lo, int mi, int hi) { 
	int* A = arr + lo;//A[0,hi-lo)=arr[lo,hi)
	//B[0,mi-lo)=arr[lo,mi)
	int lb = mi - lo;
	int* B = new int[lb];//分配lb个单位的连续整型空间
	for (int i = 0; i < lb; i++) { 
		B[i] = arr[lo + i];//B[i]=*(arr+lo+i);
	}
	//C[0,hi-mi)=arr[mi,hi)
	int lc = hi - mi;
	int* C = arr + mi;
	for (int i = 0, j = 0, k = 0; i < lb || j < lc;) { 
		if ((i < lb) && (!(j < lc) || B[i] < C[j])) A[k++] = B[i++];
		if ((j < lc) && (!(i < lb) || C[j] <= B[i])) A[k++] = C[j++];
	}
}

void mergeSort(int arr[], int lo, int hi) { 
	if (hi - lo < 2) return;
	int mi = (lo + hi) / 2;
	mergeSort(arr, lo, mi);
	mergeSort(arr, mi, hi);
	merge(arr, lo, mi, hi);
}

6 快速排序

//快速排序
void quickSort(int* arr,int left,int right) { 
	//此处必须要写为>=;若写为==则会出错
	if (left >= right) return;
	int l = left;
	int r = right;
	int pivot = arr[l];
	//标志为false时,表示改指针上的数据已被拿出
	//标志为true时,表示指针上的数据未被拿出
	bool fflag = false;
	bool rflag = true;
	while (l < r) { 
		if (rflag) { 
			if (!fflag && arr[r] < pivot) { 
				arr[l] = arr[r];
				fflag = true;
				rflag = false;
			}
			else r--;
		}
		if (fflag) { 
			if (!rflag && arr[l] >= pivot) { 
				arr[r] = arr[l];
				fflag = false;
				rflag = true;
			}
			else l++;
		}
	}
	arr[l] = pivot;
	quickSort(arr, left, l - 1);
	quickSort(arr, l + 1, right);
}

7 堆排序

堆排原理详细可以参考B站视频:https://www.bilibili.com/video/BV1Eb41147dK

void swap(int tree[], int a, int b) { 
	int temp=tree[a];
	tree[a] = tree[b];
	tree[b] = temp;
	
}

//此处的n为传入的数组的大小
void heapify(int tree[], int n, int i) { 
	if ((2 * i + 1) > n-1) return;
	int pare = (i - 1) / 2;
	int lchild = 2 * i + 1;
	int rchild = 2 * (i + 1);
	int maxIndex = i;
	if (tree[maxIndex] < tree[lchild]) maxIndex = lchild;
	if (tree[maxIndex] < tree[rchild]) maxIndex = rchild;
	if (maxIndex != i)
	{ 
		swap(tree, maxIndex, i);
		i = maxIndex;
		heapify(tree, n, i);
	}
}

//当数列完全无序时,生成堆序列
void generateHeap(int tree[], int n) { 
	int last = ((n - 1) - 1) / 2;
	for (int i = last; i >= 0; i--) { 
		heapify(tree, n, i);
	}
}

//堆排序
void heapSort(int tree[],int n) { 
	generateHeap(tree, n);
	for (int i = n - 1; i > 0; i-- ) { 
		swap(tree, i, 0);
		heapify(tree, i - 1, 0);
	}
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服