歸併排序

歸併排序也是一種常見的排序算法,下面就讓咱們簡單看一下歸併排序的實現。java

//將給定區間的數組經過新的數組temp進行排序
public static void merge(int[] array, int[] temp, int leftPos, int rightPos, int rightEnd) {
    int leftEnd = rightPos - 1;
    int tempPos = leftPos;
    int length = rightEnd - leftPos + 1;

    //主要的循環操做
    while (leftPos <= leftEnd && rightPos <= rightEnd) {
        if (array[leftPos] <= array[rightPos]) {
            temp[tempPos++] = array[leftPos++];
        } else {
        //當leftPos追上rightPos的時候就表明left已經完成排序,而right的剩下值仍需繼續排序。
            temp[tempPos++] = array[rightPos++];
        }
    }
    while (leftPos <= leftEnd) {
        temp[tempPos++] = array[leftPos++];
    }
    while (rightPos <= rightEnd) {
        temp[tempPos++] = array[rightPos++];
    }
    //由於array並不必定是從0開始逐漸進行歸併的,因此不能用array[i]=temp[i],只能從結果往前逐漸賦值回去
    for (int i = 0; i < length; i++, rightEnd--) {
        array[rightEnd] = temp[rightEnd];
    }
}

public static void sort(int[] array, int[] temp, int left, int right) {
    if (left < right) {
        int center = (left + right) / 2;
        //不斷的遞歸
        sort(array, temp, left, center);
        sort(array, temp, center + 1, right);
        merge(array, temp, left, center + 1, right);
    }
}

public static void mergeSort(int[] array) {
    int[] temp = new int[array.length];
    sort(array, temp, 0, array.length - 1);
}

最優時間複雜度:O(n)算法


平均時間複雜度:O(nlog(n))數組


最壞時間複雜度:O(nlog(n))spa


平均空間複雜度:O(n),網上有網友猜想歸併排序的空間複雜度,有的說是O(n+logn),有的說是O(n),在這裏我認爲在遞歸條件下去進行排序的話,應該是O(n+logn),logn是遞歸棧深度,n是申請的數組。。。非遞歸的話就是n了。。不知道這種理解是否正確,還望指正。code

由於在歸併排序的過程當中咱們不會交換兩個同樣的數字的位置(沒人這麼蛋疼吧),因此整體來看歸併排序是穩定的排序算法。
orm

相關文章
相關標籤/搜索