• 归并排序(C++版)


      实现自《算法导论》上的归并排序。

      写这个算法花了比较长的时间,一直在撸Java,好久不摸C++,再次用起C++倍感亲切。写这个算法很简单,原理也很简单,但是陷阱在与这个算法中对数组的使用,下标的访问和控制。一般归并排序都是用1作下标,但是今天作死想用0作下标。恩~一直没有转过脑筋来,但是最终还是实现了。

      源代码如下:

    #include<iostream>
    #include<ctime>
    #include<cstdlib>
    using namespace std;
    const int N = 204800;
    
    void Merge(int arr[], int p, int q, int r){
        int n1 = q - p + 1;
        int n2 = r - q + 1;
        int left[n1 + 1], right[n2];
    
        for (int i = 0; i != n1; ++i){
            left[i] = arr[p + i];
        }
        left[n1] = N;
    
        for (int j = 0; j != n2 - 1; ++j){
            right[j] = arr[q + j + 1];
        }
        right[n2 - 1] = N;
    
        int i = 0, j = 0;
        for(int k = p; k != r + 1; ++k){
            if(left[i] > right[j]){
                arr[k] = right[j];
                ++j;
            }
            else{
                arr[k] = left[i];
                ++i;
            }
        }
    }
    
    void MergeSort(int arr[], int p, int r){
        if(p < r){
            int q = (p + r)/2;
            MergeSort(arr, p, q);
            MergeSort(arr, q + 1, r);
            Merge(arr, p, q, r);
        }
    }
    
    int main(){
        int arr[10] = {300, 60, 22, 16, 85, 89, 30, 99, 103, 55};
        MergeSort(arr, 0, 9);
        for(int i = 0; i < 10; ++i){
            cout<<arr[i]<<endl;
        }
        return 0;
    }
    

        开始的ctime本来打算用时间做种子出随机数。但是这个随机数和正态分布略符合,弃之。随机数部分代码如下:

        srand(time(NULL));
        int arr[rand()%100];
        for (int i = 0; i != sizeof(arr)/sizeof(int); ++i){
            arr[i] = rand()%500;
        }
        for (int i = 0; i != sizeof(arr)/sizeof(int); ++i){
            cout<<arr[i]<<"   ";
            if((i + 1) % 10 == 0)
                cout<<endl;
        }
        cout<<"end"<<endl;
        MergeSort(arr, 0, sizeof(arr)/sizeof(int));
        for (int i = 0; i != sizeof(arr)/sizeof(int); ++i){
            cout<<arr[i]<<"   ";
            if((i + 1) % 10 == 0)
                cout<<endl;
        }
    

                                                      联系方式:18829213810@126.com

  • 相关阅读:
    bzoj1072: [SCOI2007]排列perm
    bzoj1226: [SDOI2009]学校食堂Dining
    bzoj3208: 花神的秒题计划Ⅰ
    bzoj1079: [SCOI2008]着色方案
    bzoj3573: [Hnoi2014]米特运输
    bzoj1040: [ZJOI2008]骑士
    bzoj 1369: [Baltic2003]Gem
    bzoj2818: Gcd
    bzoj2705: [SDOI2012]Longge的问题
    整数分解
  • 原文地址:https://www.cnblogs.com/zhaoyansheng/p/4890590.html
Copyright © 2020-2023  润新知