首页 > 代码库 > 处理海量数据的三大排序之——归并排序(C++)
处理海量数据的三大排序之——归并排序(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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。