归并排序

来源:互联网 发布:淘宝产品评价怎么写 编辑:程序博客网 时间:2024/05/16 17:55

        都怪我们老师太牛逼,硬是成功的让我们相信了“数据结构”是一门只要上课听一下就可以的课程,不需要实践的。咱的理论可不是一般的牛,希快选堆是不稳定的排序算法balabala……言归正传,之所以需要学习归并排序是因为归并排序是时间复杂度接近最优的O(nLogn)的排序算法,平时写代码我们应该优先选者随机快速排序,那为什么还要学习归并排序呢?有两条理由可以说服我。

1, 学习一种新的思想,归并排序采用典型的分治法,也是分治法的一个典型应用。

2,对于链表这样的不能随机访问的数据结构,无法用快速排序,所以最合适的排序的算法应该是归并排序。


我一直怀疑归并排序的效率,应该它每次都需要归并两段数组,这样以来二去,也不知道耗了多少时间,所以以前一直不待见归并排序,今晚测试了一下,它的效率还挺让人意外的,比经过优化的c++的sort慢不了多少,只是需要用一个额外的数组罢了。直观上认为归并排序效率不高,只能怪自己数学学得不好,对计算机理解还不够深入。

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <time.h>using namespace std;void merge(int a[], int first, int mid, int last, int temp[]){int i = first;int j = mid +1;int m = mid, n = last;int k = 0;while (i <= m && j <= n) {if (a[i] < a[j]) {temp[k++] = a[i++];}else{temp[k++] = a[j++];}}while (i <= m) {temp[k++] = a[i++];}while (j <= n) {temp[k++] = a[j++];}for (i = 0; i < k; i++) {a[first + i] = temp[i];}}void mergesort(int a[], int first, int last, int temp[]){if(first < last){int mid = (first + last) / 2;mergesort(a, first, mid, temp);mergesort(a, mid + 1, last, temp);merge(a, first, mid, last, temp);}}bool MergeSort(int a[], int len){int *p = new int[len];if (p == NULL) {return false;}mergesort(a, 0, len-1, p);delete [] p;return true;}int main(int argc, char* argv[]){int i;int flag = 1;const int size = 1000000;int data[size];srand(time(0));for (i = 0; i < size; i++) {data[i] = (flag = -flag) * (rand() % size);}MergeSort(data, size);for (i = 0; i < size; i+=100000) {std::cout << data[i] << "\t";}cout << endl;return 0;}

对一百万个数进行排序,瞬间出结果,而且不必快排慢多少。


原创粉丝点击