合并排序

算法设计

(1)分解---奖待排元素分成大小大致相同的两个子序列。(2)治理---对两个子序列进行合并排序。(3)合并---将排好序的有序子序列进行合并,得到最终的有序序列。

伪代码详解

(1)合并操作

int *B=new int[high-low+1];
int i=low,j=mid+1,k=0;
while(i<=mid&&j<=high)
{
    if(A[i]<=A[j])
        B[K++]=A[i++]
    else
        B[K++]=A[j++];
}

( 2 )递归形式的合并排序算法

void MergeSort(int A[],int low,mid,int high)
{
    if(low<=high){
        int mid=(low+high)/2;
        MergeSort(A,low,mid);
        MergeSort(A,mid+1,high);
        Merge(A,low,mid,high);//合并的算法
    }
}

代码详解

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

void Merge(int A[],int low,int mid,int high){
int *B=new int[high-low+1];
int i=low,j=mid+1,K=0;
while(i<=mid&&j<=high)
{
    if(A[i]<=A[j])
        B[K++]=A[i++];
    else
        B[K++]=A[j++];
}
while(i<=mid) B[K++]=A[i++];
while(j<=high) B[K++]=A[j++];
for(i=low,K=0;i<=high;i++)
    A[i]=B[K++];
delete []B;
}

void MergeSort(int A[],int low,int high)
{
    if(low<=high){
        int mid=(low+high)/2;
        MergeSort(A,low,mid);
        MergeSort(A,mid+1,high);
        Merge(A,low,mid,high);//合并的算法
    }
}

int main()
{
    int n,A[100];
    cout<<"请输入数列中的元素个数n为:"<<endl;
    cin>>n;
    cout<<"请依次输入数列中的元素:"<<endl;
    for(int i=0;i<n;i++)
        cin>>A[i];
    MergeSort(A,0,n-1);
    cout<<"合并排序结果:"<<endl;
    for(int i=0;i<n;i++)
        cout<<A[i]<<" ";
    cout<<endl;
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_40728285/article/details/79949293