排序算法---归并排序

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));
        }
    }
}
原文地址:https://www.cnblogs.com/morongwendao/p/6899070.html