归并排序模板

来源:互联网 发布:c语音编程招聘 编辑:程序博客网 时间:2024/06/06 02:22

归并:将两个或两个以上的有序表组合成一个新的有序表。

一般情况不用这种方式排序,只有在将多个有序序列整合成一个有序序列是才会用到归并排序,才能想归并效率体现的最高。

算法描叙:

1、设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1。

2、两两合并,得到 n/2 个长度为2或1的有序子序列。

3、再两两合并,……如此重复,直至得到一个长度为n的有序序列为止。

个人见解:也就是先将一个无序的序列对半拆分,将拆分后的序列继续拆分,直到拆分成一个元素为一个序列为止,然后在将两个这样的子序列有序的合并成一个序列,以此往回合并,从而达到排序的效果。(思想很容易理解,就是实现起来有点麻烦)

例:


public class SortMethods {/*输出数组中的元素*/private static void print(int[] a) {for(int num: a){System.out.print(num+"\t");}System.out.println();}private static void swap(int[] a, int i, int j) {int temp;temp =a[i];a[i] = a[j];a[j] = temp;}public static void main(String[] args) {int a[] = {0,21,25,49,25,16,15,8,-2,0,-9,67,34,5,12,40};shellSort(a);print(a);}private static void mergeSort(int[] a, int left, int right) {if(left<right){//至少有2个元素int mid = (left+right)/2; //二分,取中点//把序列拆分成两个子序列:[left,mid] 和  [mid+1,right]//同时还要对分解后的子序列分别进行递归“归并排序”mergeSort(a,left,mid);mergeSort(a,mid+1,right);//把前面两个已经排好序的子序列进行归并int b[] = new int[a.length];merge(a,b,left,mid,right);copyArray(a,b,left,right);}}private static void copyArray(int[] a, int[] b, int left, int right) {//这里也可以直接用system中的copyArray来代替for(int i=left;i<=right;i++){a[i] = b[i];}}//把两个已经排好序的子序列(a[left,mid]和a[mid+1,right]) 合并成一个 ( b[left,right] )private static void merge(int[] a, int[] b, int left, int mid, int right) {int p = left;int r=mid+1;int k=left;while( p<=mid && r<=right ){if(a[p]<=a[r]){b[k++] = a[p++];}else{b[k++] = a[r++];}}//此时,肯定有一个子序列中的元素全部移到b[]数组,因此,只要把还未移完的子序列当中的所有剩余元素直接对拷到数组b[]当中即可if(p>mid){//左子序列已经完成。因此剩下的是右序列,对拷右序列当中的剩余元素即可for(int i=r;i<=right;i++){b[k++]=a[i];}}else{//对拷左子序列中的剩余元素for(int i=p;i<=mid;i++){b[k++]=a[i];}}}}







0 0