【每日一题(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)数据量 | 运行时间 |
---|---|
5000 | 0.001s |
20000 | 0.004s |
50000 | 0.012s |
100000 | 0.022s |
1000000 | 0.259s |
10000000 | 2.839s |
100000000 | 30.312s |
相关文章推荐
- 归并排序(Merge Sort)
- 归并排序(merge sort)c++实现
- 归并排序(Mergesort)之Java实现
- 归并排序(Merge Sort)
- 算法基础3:归并排序(Merge Sort)
- 排序算法(二)—归并排序(Merge sort)
- 归并排序(mergesort)
- Natural Merge Sort(自然归并排序)
- 面试之路(16)-归并排序详解(MergeSort)递归和非递归实现
- js算法:Merge Sort 归并排序
- 【内部排序】八:归并排序(Merge Sort)详解与代码
- C++ Merge sort(归并排序)
- 【算法导论学习-002】归并排序(MergeSort)
- 归并排序(MergeSort)Java实现
- 归并排序(mergeSort)之非递归算法
- 归并排序(merge sort)
- In-place Merge Sort (原地归并排序)
- 冒泡排序(方法名:bubbleSort) 与 归并排序(mergeSort)
- 算法第三次作业(1. 排序。对文件 largeW.txt(下载链接)中的数据,编程实现冒泡排序(方法名:bubbleSort) 与 归并排序(mergeSort),把排序后的结果分别保存到largeW
- 原地归并排序(Spot Merge Sort)