将两个或者两个以上的有序表组合成一个新的有序表

无论是顺序存储还是链式存储,都能在O(m+n)的时间量级上完成

稳定O(nlogn)

分治策略   递归

2-路归并排序:将一维数组中前后相邻的两个有序序列归并为一个有序序列

 

    public static void mergeSort(int[] array){
        int temp[] = new int[array.length];    //和待排序序列等长的数组,用于在排序过程中临时存储
        subMergeSort(array, 0, array.length-1, temp);
    }
    
    public static void subMergeSort(int[] array,int left,int right,int[] temp){
        //将待排序序列分成一个一个的子序列,直到子序列的长度为1,然后一步一步将子序列合并成一个一个有序的子序列,直到整体有序
        
        int mid = (left+right)/2;
        System.out.print("sub------"+left+"-"+mid+"-"+right+"---");listArray(array,left,right);
        
        if(left<right){    
            subMergeSort(array, left, mid, temp);
            subMergeSort(array, mid+1, right, temp);
            mergeSub(array, left, mid, right, temp);
        }
        
    }
    public static void mergeSub(int[] array,int left,int mid,int right,int[] temp){
        
        int i = left;//前面那个子序列的第一个元素的下标,前面子序列最后一个元素的下标为mid
        int j = mid+1;//后面那个子序列的第一个元素的下标,后面子序列的最后一个元素的下标为right
        int index = 0;//临时数组的下标
        //顺序表的合并
        //按照从小到大,将两个子序列的元素按照顺序临时存放在temp[]中
        while(i<=mid && j<=right){
            //两个子序列都没到最后一个元素,循环,当其中一个到最后一个元素时,while循环停止
            if(array[i]<=array[j]){
                temp[index++] = array[i++];
            }else{
                temp[index++] = array[j++];
            }
        }
        //上面while循环停止,将没到最后一个元素的那个子序列的后续元素加到已排序元素之后
        while(i<=mid){
            temp[index++] = array[i++];
        }
        while(j<=right){
            temp[index++] = array[j++];
        }
        //本次操作将原数组中下标从left到right的元素排成有序的了,因此,将这几个元素拷贝到原数组中,这样,操作完成之后,原数组中的状态就是最后结果
        index = 0;
        i=left;
        
        while(i<=right){
            array[i++] = temp[index++];
        }
        System.out.print("after merge--");listArray(array);
        
    }
原始数据:49 38 65 97 76 13 27 49 
sub------0-3-7---49 38 65 97 76 13 27 49 
sub------0-1-3---49 38 65 97 
sub------0-0-1---49 38 
sub------0-0-0---49 
sub------1-1-1---38 
after merge--38 49 65 97 76 13 27 49 
sub------2-2-3---65 97 
sub------2-2-2---65 
sub------3-3-3---97 
after merge--38 49 65 97 76 13 27 49 
after merge--38 49 65 97 76 13 27 49 
sub------4-5-7---76 13 27 49 
sub------4-4-5---76 13 
sub------4-4-4---76 
sub------5-5-5---13 
after merge--38 49 65 97 13 76 27 49 
sub------6-6-7---27 49 
sub------6-6-6---27 
sub------7-7-7---49 
after merge--38 49 65 97 13 76 27 49 
after merge--38 49 65 97 13 27 49 76 
after merge--13 27 38 49 49 65 76 97 
13 27 38 49 49 65 76 97