算法设计
(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; }