【算法】归并排序
【参考代码】
void msort(int s, int t){
if(s==t) return ; //如果只有一个数字则返回,无须排序
int mid=(s+t)/2;
msort(s,mid); //分解左序列
msort(mid+1,t); //分解右序列
int i=s, j=mid+1, k=s; //接下来合并
while(i<=mid && j<=t){
if(a[i]<=a[j]){
r[k]=a[i];
k++;
i++;
}else{
r[k]=a[j];
k++;
j++;
}
}
while(i<=mid){ //复制 左边子序列剩余
r[k]=a[i];
k++;
i++;
}
while(i<=mid){ //复制 右边子序列剩余
r[k]=a[j];
k++;
j++;
}
for(int i=s;i<=t;i++)
a[i]=r[i];
}【图解】
【合并过程】
比较a[i]和a[j]的大小,若a[i]<=a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。
归并排序的算法我们通常用递归实现,先把排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。
扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。




