您的位置:首页 > 其它

【每日一题(28)】高等排序算法(2) 归并排序(MergeSort)

2018-03-10 00:03 453 查看

归并排序

介绍

归并排序,是分治法的一个重要应用,主要分为分、合两个阶段。

在归并排序中,合非常重要,要将多个数组按照排序合在一起,要运用到多个指针。

但是归并排序的代码量并不大,只要运用递归,就可以分为logn层,并且要运用到额外的储存空间。

但是归并排序是一种稳定排序。

目前归并排序处理一亿个数据只需30s。

代码

#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
using namespace std;
void _printf(int *a, int n){
for(int i = 0;i < n; i++){
cout << a[i] << " ";
}
cout << endl;
}void merge(int *a,int left,int right,int *temp){
if(left < right){
int mid = (left + right)/2;
int i = left,j = mid + 1,t = 0;
while(i <= mid && j <= right){
if(a[i] <= a[j]){
temp[t] = a[i];
i++;
}else{
temp[t] = a[j];
j++;
}
t++;
}
while(i <= mid){
temp[t] = a[i];
i++;
t++;
}
while(j <= right){
temp[t] = a[j];
j++;
t++;
}
t = 0;
while(left <=right){
a[left] = temp[t];
t++;
left++;
}
}
}
void _sort(int *a,int left,int right,int *temp){
if(left < right){
int mid = (left + right)/2;
_sort(a,left,mid,temp);
_sort(a,mid + 1,right,temp);
merge(a,left,right,temp);
}
}
int main()
{
int n;
while(cin >> n){
clock_t begin,stop;
FILE *fp;
fp = fopen("1000000000.txt","r");
int *a = new int
,*temp = new int
;
for(int i = 0;i < n; i++){
fscanf(fp,"%d",&a[i]);
//cin >> a[i];
}
cout << "start" << endl;
begin = clock();
_sort(a,0,n - 1,temp);
stop = clock();
//_printf(a,n);
cout << "runtime  " << (double)(stop - begin)/CLOCKS_PER_SEC << "s" << endl;
}

return 0;
}


速度

归并排序的平均复杂度为O(nlogn)

数据量运行时间
50000.001s
200000.004s
500000.012s
1000000.022s
10000000.259s
100000002.839s
10000000030.312s
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: