【归并排序(非递归)】MergeSort(non-recursion)

归并排序(非递归) 

postscript:本博客也有归并排序的递归算法。详见:归并排序(递归)
算法思想:
假设数组a为待排序数组。
首先将数组a中相邻元素两两配对。用合并算法将他们排序,构成n/2组长度为2的排好序的子数组段,然后再将他们排序成长度为4的排好序的子数组段,如此继续下去,直至整个数组排好序。
#include <iostream>

template <class T>
void Merge(T a[],T b[],int left,int mid,int right){
    int i = left, j = mid+1, k = left;
    while ((i <= mid) && (j <= right)) {
        if (a[i] <= a[j])
            b[k++] = a[i++];
        else
            b[k++] = a[j++];
    }
    if (i > mid)
        for (int r=j; r<=right; r++)
            b[k++] = a[r];
    else
        for (int r=i; r<=mid; r++) {
            b[k++] = a[r];
        }
}

template <class T>
void MergePass(T a[], T b[], int s, int n){
   //合并大小为s的相邻子数组 
    int i=0;
    while (i <= n - 2*s) { //合并大小为s的相邻两段子数组
        Merge(a, b, i, i+s-1, i+2*s-1);
        i = i+2*s; 
    }
    
    if (i+s < n) //剩下的元素少于2s个
        Merge(a, b, i, i+s-1, n-1);
    else
        for (int j=i; j<n; j++)
            b[j] = a[j];
}

template <class T>
void MergeSort(T a[],int n){
    T* b = new T [n];
    int s=1;
    while (s < n) {
        MergePass(a,b,s,n);//合并到b[]中。
        s += s;
        MergePass(b,a,s,n);//合并到a[]中。
        s += s;
    }
}

int main (int argc, const char * argv[])
{
    int a[] = {9,3,34,93,2,3};
    int n = 6;
    MergeSort(a,n);
    for (int i=0; i<n; i++)
        std::cout << a[i] << " ";
    std::cout << std::endl;
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值