排序-归并

2018-07-11  本文已影响0人  sjandroid

今天记录下关于:归并排序一些理解和心得。
主要分为以下几个方面分享


归并排序的思想


实现方式

    public static void main(String[] args){
        Integer[] array = Util.createRandomArray(1000, 30);
        Integer[] array2 = Arrays.copyOf(array, array.length);
        Integer[] array3 = Arrays.copyOf(array, array.length);

        //调用Arrays.sort()
        Util.sysSort(array2);
        Util.print(array2, "Arrays.sort--");

        System.out.println("--------------------------------------------------------------------");

        //归并排序
        Integer[] result = mergeSort(array3);
        Util.print(result, " Merge Sort--");
    }

    public static Integer[] mergeSort(Integer[] array){
        //FIXME 要点
        //先排序
        //再合并

        if(array == null || array.length == 1){
            return array;
        }

        Integer[] result;

        //退出条件
        int length = array.length;
        if(length == 1){
            result = array;

        } else if(length == 2){
            swap(0, 1, array);
            result = array;

        } else {
            Integer[] left = new Integer[array.length >> 1];
            Integer[] right = new Integer[array.length - left.length];
            System.arraycopy(array, 0, left, 0, left.length);
            System.arraycopy(array, left.length, right, 0, right.length);

            left = mergeSort(left);
            right = mergeSort(right);

            result = merge(left, right);
        }

        return result;
    }

    private static Integer[] merge(Integer[] left, Integer[] right){
        Integer[] result = new Integer[left.length + right.length];

        int leftIndex = 0;
        int rightIndex = 0;
        int resultIndex = 0;
        while(leftIndex < left.length && rightIndex < right.length){
            Integer temp;

            if(left[leftIndex] < right[rightIndex]){
                temp = left[leftIndex++];
            } else {
                temp = right[rightIndex++];
            }

            result[resultIndex++] = temp;
        }

        while(leftIndex < left.length){
            result[resultIndex++] = left[leftIndex++];
        }

        while(rightIndex < right.length){
            result[resultIndex++] = right[rightIndex++];
        }

        return result;
    }

    private static void swap(int left, int right, Integer[] array){
        if(array[left] <= array[right]){
            return;
        }

        int temp = array[left];
        array[left] = array[right];
        array[right] = temp;
    }

log

Arrays.sort--:53---63---119---127---133---192---222---242---328---328---428---511---598---607---618---640---656---667---675---695---700---701---730---794---812---825---842---872---896---921
--------------------------------------------------------------------
 Merge Sort--:53---63---119---127---133---192---222---242---328---328---428---511---598---607---618---640---656---667---675---695---700---701---730---794---812---825---842---872---896---921


时间复杂度


应用


上一篇下一篇

猜你喜欢

热点阅读