java歸併排序

neuyu發表於2021-09-09

概述

歸併排序與快速排序相同,同樣是借鑑二叉樹的思想,時間複雜度O(n),與快速排序一樣是大量資料排序的最優方式之一。

思路分析

歸併排序是將目標陣列分成左右兩個陣列,左右兩個陣列必須是有序的,然後對這兩個陣列合並從而實現排序。對於任意的陣列都可以將所有的資料分成若干個陣列,每個陣列中都只有一個元素,然後兩兩合併。(因此,歸併排序的記憶體開銷會比快速排序多)

程式碼實現

  private void mergeSort(int[] array, int left, int right) {        if (left >= right) {            return;
        }        int mid = (left + right) >> 1;
        mergeSort(array, left, mid);
        mergeSort(array, mid + 1, right);
        merge(array, left, mid + 1, right);
    }    private void merge(int[] array, int left, int mid, int right) {        int leftSize = mid - left;        int rightSize = right - mid + 1;        int[] leftArray = new int[leftSize];        int[] rightArray = new int[rightSize];
        System.arraycopy(array, left, leftArray, 0, leftSize);
        System.arraycopy(array, mid, rightArray, 0, rightSize);        int index=left;        int leftIndex = 0;        int rightIndex = 0;        while (leftIndex<leftSize&&rightIndex<rightSize){            if(leftArray[leftIndex]<rightArray[rightIndex]){                array[index++] = leftArray[leftIndex++];
            }else {                array[index++] = rightArray[rightIndex++];
            }
        }        while (leftIndex<leftSize){            array[index++] = leftArray[leftIndex++];
        }        while (rightIndex<rightSize){            array[index++] = rightArray[rightIndex++];
        }
    }

測試程式碼

 @Test    public void testMergeSort() {        int[] array = new int[]{1, 3, 4, 10, 2, 5, 6, 9, 7, 8};
        mergeSort(array, 0, array.length - 1);        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }

結果列印

1
2
3
4
5
6
7
8
9
10



作者:夜亦明
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4550/viewspace-2821637/,如需轉載,請註明出處,否則將追究法律責任。

相關文章