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

归并排序

介绍

归并排序,是分治法的一个重要应用,主要分为分、合两个阶段。
在归并排序中,合非常重要,要将多个数组按照排序合在一起,要运用到多个指针。
但是归并排序的代码量并不大,只要运用递归,就可以分为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

猜你喜欢

转载自blog.csdn.net/qq_40861916/article/details/79504521