青少年编程知识记录 codecoming

【算法】归并排序

【参考代码】

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]。





(adsbygoogle = window.adsbygoogle || []).push({});

作者:亿万年的星光 分类:算法 浏览: