分治---合并排序

时间:2022-06-15 11:05:07

并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序,合并排序也叫归并排序。

1、递归实现的合并排序 

#include <iostream>
#include <stdio.h>
using namespace std;

int a[] = {10,5,9,4,3,7,8};
int b[7];

template <class Type>
void Merge(Type c[],Type d[],int l,int m,int r);

template <class Type>
void MergeSort(Type a[],int left,int right);

int main()
{
    for(int i=0; i<7; i++)
        cout<<a[i]<<" ";
    cout<<endl;
    MergeSort(a,0,6);
    for(int i=0; i<7; i++)
        cout<<a[i]<<" ";
    cout<<endl;
}

template <class Type>
void Merge(Type c[],Type d[],int l,int m,int r)
{//合并c[l:m]和c[m+1:r]到d[l:r]
    int i = l,j = m + 1,k = l;
    while((i<=m)&&(j<=r))
    {
        if(c[i]<=c[j])
            d[k++] = c[i++];
        else
            d[k++] = c[j++];
    }

    if(i>m)
    {
        for(int q=j; q<=r; q++)
            d[k++] = c[q];  
    }
    else
    {
        for(int q=i; q<=m; q++)
            d[k++] = c[q];
    }
}

template <class Type>
void MergeSort(Type a[],int left,int right)
{//递归合并
    if(left<right)
    {
        int i = (left + right)/2;
        MergeSort(a,left,i);
        MergeSort(a,i+1,right);
        Merge(a,b,left,i,right);//合并到数组b

        //复制回数组a
        for(int g=left; g<=right; g++)
            a[g] = b[g];  
    }
}
2、合并排序非递归实现
从分支策略机制入手,可消除程序中的递归。非递归实现的大致思路是先将数组a中元素两两配对,用合并算法将它们排序,构成n/2组长度为2的排好的子数组段,然后再将它们排成长度为4的排好序的子数组段,如此继续下去,直到整个数组排好序。

(即:二路归并排序:见点击打开链接