分治---合并排序

来源:互联网 发布:欧洲卡车模拟2 mac 编辑:程序博客网 时间:2024/05/16 08:38

并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(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的排好序的子数组段,如此继续下去,直到整个数组排好序。

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