归并排序
分解:分解待排序的n个元素序列成各具 n/2 个元素的两个子序列。
解决:使用归并排序递归地排序两个子序列。
合并:合并两个排序的子序列以产生已排序的答案。
当待排序的序列长度为1时,递归“开始回升”,此时长度为1的每个子序列都已排好序,然后将已排好序的子序列合并。

const int INF=0xfffffff; void Merge(int a[],int p,int q,int r)//合并排序,a[p,r]由两个有序的子序列组成,将两个子序列合并 { int n1=q-p+1; int n2=r-q; int L[20],R[20]; for(int i=1; i<=n1; i++) L[i]=a[p+i-1]; for(int i=1; i<=n2; i++) R[i]=a[q+i]; L[n1+1]=INF; R[n2+1]=INF; for(int k=p,i=1,j=1; k<=r; k++) { if(L[i]<R[j]) { a[k]=L[i]; i++; } else { a[k]=R[j]; j++; } } } void MergeSort(int a[],int p,int r)//归并排序算法过程 { if(p<r) { int q=(p+r)/2; MergeSort(a,p,q); MergeSort(a,q+1,r); Merge(a,p,q,r); } }
浙公网安备 33010602011771号