归并排序

来源:互联网 发布:魔兽美工代码编辑器 编辑:程序博客网 时间:2024/06/06 09:37

归并排序(merging sort)是利用“归并”技术来排序。“归并”是将两个或两个以上的有序表组合成一个新的有序表。

利用归并思想实现排序:假设 初始序列有n个记录,则可以看成是n 个有序的子序列,每个子序列的长度为2,然后两 两归并,......,如此重复,直到得到一个长度为n的有序的序列为止,这种排序方法称为2-路归并排序。

2-路归并排序中的归并算法的基本思路:

两个有序的子序列sr[low...m]和sr[m+1...high],先将他们合并到一个局部的暂存序列tr中,待合并完成后将tr中的有序序列复制到sr中。

合并过程:在合并的过程中设置I、j、k三个指针,分别指向sr[low...m]和sr[m+1...high],tr[0...high]这三个序列的起始位置。合并时依次比较sr[i]和sr[j]的值,取较小的值放到tr[k]中,然后将被复制的记录的指针i或j加1,将tr的指针k加1.

重复这一过程直至两个输入的子文件有一个已全部复制完毕(不妨称其为空),此时将另一非空的子文件中剩余记录依次复制到tr中即可。

合并的具体算法如下:

/** * 归并算法: * 将有序的sr[i..m]和sr[m+1..n]归并为有序的tr[i..n] * @param sr待排序的序列 * @param tr归并后的有序序列 * @i,m表示sr的上下界 * */protected void merge(int[]sr,int[]tr,int i,int m,int n){int k,j;for(k=i,j=m+1;i<=m&&j<=n;++k){tr[k]=(sr[i]>sr[j]?sr[j++]:sr[i++]);}if(i<=m)System.arraycopy(sr, i, tr, k, m-i+1);if(j<=n)System.arraycopy(sr, j, tr, k, n-j+1);System.arraycopy(tr, i, sr, i, n-i+1);//将在tr中排好序的子序列复制到sr中}

2-路归并的递归实现法:

/** * 将待排序的序列sr进行递归的划分,直到递归到子序列的长度为1为止 * 将递归的子序列进行归并操作 * */private void mSort(int[]sr,int[]tr,int s,int t){if(s==t)tr[s]=sr[s];else{int m=(s+t)/2;//将sr[s..t]平分为sr[s..m]和sr[m+1..t]mSort(sr,tr,s,m);//依次递归的将s..m之间的序列进行平分,当m=0时递归停止,然后反推mSort(sr,tr,m+1,t);this.merge(sr, tr, s, m, t);}}





利用初始

0 0