处理海量数据的三大排序之——归并排序(C++)
代码实现
#include "stdafx.h" #include <iostream> #include <ctime> using namespace std; int a[1000000]; int tempA[1000000]; #define BEGIN_RECORD \ { clock_t ____temp_begin_time___; ____temp_begin_time___=clock(); #define END_RECORD(dtime) \ dtime=float(clock()-____temp_begin_time___)/CLOCKS_PER_SEC;} /* 归并排序的合并过程 a - 待排序数组 l - 排序区域左边界 m - 排序区域中点 r - 排序区域右边界 */ void merge(int a[], int l, int m, int r) { int i = l; int j = m+1; int k; //int tempA[100000]; //空间复杂度O(n),在最后一次合并需要用到n个临时存储空间 //将两个有序排序区域合并成一个有序区域 //part1:两排序区域都从索引N(0,1...n)开始比较大小,取较小的值push进临时数组,同时该排序区域比较索引+1;当任一排序区域的值取完后,结束part1 for (k = l; i <= m && j <= r; k++) { if(a[i] <= a[j]) { tempA[k] = a[i++]; } else { tempA[k] = a[j++]; } } //part2:将另一排序区域剩余的值按有序push进临时数组。此时临时数组为合并的有序区域。结束part2 if(i <= m) for (; k <= r; k++) tempA[k] = a[i++]; if(j <= r) for (; k <= r; k++) tempA[k] = a[j++]; //part3:将临时数组数据拷贝到原数组。排序结束 for (int k = l; k <= r; k++) { a[k] = tempA[k]; } } /** 归并排序 时间复杂度O(n*logn), 空间复杂度O(n) 在需要稳定排序的情况下,归并排序是最 在不考虑稳定性的情况下,归并排序由于需要O(n)的临时存储空间,比较耗费内存,效果不如快速排序 */ void mergeSort(int a[], int l, int r) { int m; if(l < r) { m = (l + r)/2; //递归分解的过程,细分区域直到每个区域元素个数小于等于2 mergeSort(a, l, m-1); mergeSort(a, m+1, r); //归并过程 merge(a, l, m, r); } } void printArray(int a[], int length) { cout << "数组内容:"; for(int i = 0; i < length; i++) { if(i == 0) cout << a[i]; else cout << "," << a[i]; } cout << endl; } int _tmain(int argc, _TCHAR* argv[]) { float tim; for (int i = 0; i < 1000000; i++) { a[i] = int(rand() % 100000); } BEGIN_RECORD //printArray(a, sizeof(a)/sizeof(int)); mergeSort(a, 0, sizeof(a)/sizeof(int)-1); //printArray(a, sizeof(a)/sizeof(int)); END_RECORD(tim) cout << "运行时间:" << tim << "s" << endl; system("pause"); return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。