zoukankan      html  css  js  c++  java
  • 排序算法---归并排序

    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));
            }
        }
    }
  • 相关阅读:
    Django异步与定时任务Celery
    SkyWalking 分布式追踪系统
    SharePoint 2010 硬件详细需求
    使用SharePoint 2010 客户端对象模型进行文档库及文档的操作
    SharePoint 2010 部署架构
    【git】项目添加.gitignore忽略.idea文件夹
    Android 横屏切换竖屏Activity的生命周期(转)
    经过完整测试的农历公历相互转换
    TZ ERP项目的随想
    C#加密与解密
  • 原文地址:https://www.cnblogs.com/morongwendao/p/6899070.html
Copyright © 2011-2022 走看看