归并排序
介绍
归并排序,是分治法的一个重要应用,主要分为分、合两个阶段。
在归并排序中,合非常重要,要将多个数组按照排序合在一起,要运用到多个指针。
但是归并排序的代码量并不大,只要运用递归,就可以分为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[n],*temp = new int[n];
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)
数据量 运行时间 5000 0.001s 20000 0.004s 50000 0.012s 100000 0.022s 1000000 0.259s 10000000 2.839s 100000000 30.312s