• 排序算法---归并排序


    1.归并排序

     顾名思义,归并排序就是递归、合并排序。先把数组逐级划分,直至每个元素为单独的一个部分。

    归并过程,先把数组复制一份,利用三个索引(k,i,j)对数组进行追踪。例如由于2>1,所以把1放在蓝色位置,然后k++,j++,进行下一个元素的处理。

      ---> ----->

     

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    //将arr[left ... mid]和arr[mid+1 ... right]两部分进行归并
    template <typename T>
    void __merge(T arr[], int left, int mid, int right){
        int len = right - left + 1;
        int * aux = new int[len];
        for (int i = left; i <= right; i++){
            aux[i - left] = arr[i];
        }
        int i = left, j = mid + 1;
        for (int k = left; k <= right; k++){
            if (i>mid){
                arr[k] = aux[j - left];
                j++;
            }
            else if (j > right){
                arr[k] = aux[i - left];
                i++;
            }
            else if (aux[i - left] < aux[j - left]){
                arr[k] = aux[i - left];
                i++;
            }
            else{
                arr[k] = aux[j - left];
                j++;
            }
        }
        delete[] aux;
    }
    
    template <typename T>
    //自顶向下的递归方法 n---n/2----n/4----n/8...
    void __mergeSort(T arr[], int left, int right){
    
        if (left >= right) {
            return;
        }
        int mid = (right - left) / 2 + left;
        __mergeSort(arr, left, mid);//0----3
    
        __mergeSort(arr, mid + 1, right);//4---7
    
        if (arr[mid] > arr[mid + 1]){  //加上这一步的判断,减少运算量
            __merge(arr, left, mid, right);
        }
    
    }
    template <typename T>
    void mergeSort(T arr[], int n){
        __mergeSort(arr, 0, n - 1);    
    }

    此外,还能采用自下而上的归并排序

    //自下而上的归并排序
    template <typename T>
    void mergeSortBU(T arr[], int n){
        for (int sz = 1; sz <= n; sz += sz){
            for (int i = 0; i + sz < n; i += sz + sz){
                __merge(arr, i, i + sz - 1, min(i + sz + sz - 1, n));
            }
        }
    }
  • 相关阅读:
    attr系列保留方法使用
    利用python的标准库hashlib 的md5()生成唯一的id
    【病因】 神经衰弱的几大病因
    群里看到的一个骗子批八字的例子
    i'll make a man out of you
    It's A Good Day To Die
    两天了。照着SVN的界面画的一个界面。
    起一卦,看看我想要的,依然这么倒霉
    倒霉倒霉真倒霉,这一卦起得和上一卦一样
    只要是倒霉,起卦就能看出来
  • 原文地址:https://www.cnblogs.com/morongwendao/p/6899070.html
Copyright © 2020-2023  润新知