O nlogn 排序之歸併排序

2021-09-16 21:28:40 字數 1541 閱讀 7595

第一輪: 1 2 3 4 | 5 6 7 8 分成兩組

第二輪: 1 2 | 3 4 | 5 6 | 7 8 每組在分成兩組

第三輪: 1 | 2 | 3 | 4 | 5 | 6| 7 | 8 每組在分成兩組

每輪分組的時間複雜度都為o(logn), 而每組的排序的時間複雜度為o(n), 綜合時間複雜度為o(nlog), 每組排完序之後,向上歸併。分組的過程是遞迴的

1. 歸併排序是以空間換時間的方式排序。除了原陣列外,還的為每乙個分組提供乙個輔助陣列。

2. 邊界問題,要規定好左中右三個邊界,即是三個陣列的索引值。這裡指定l=0(left), mid 陣列中間位置的前乙個位置。r=陣列的長度-1(right)

3. 歸併排序最重要的地方是制定三個索引值,即每組的的起始索引,為i,j。還有就是當前分組的父分組的起始索引k。

package com.fgy.learn;

/** * created by snow_fgy on 2019/4/5.

*/public class mergesort2

return a;

}public void mergesort(int arr)

// system.out.println();

}//進行遞迴後分組,分組完畢後進行歸併

private void mergesortinner(int arr, int l, int r)

/if (l >= r)

//獲取中間位置

int mid = (l + r) / 2;

mergesortinner(arr, l, mid);

mergesortinner(arr, mid + 1, r);

//分組完畢,開始歸併

/**優化:

*if(arr[mid] > arr[mid+1])

*/merge(arr,l, mid, r);

}private void merge(int arr, int l, int mid, int r)

//三個索引值

int i = l;

int j = mid + 1;

for (int k = l; k <= r; k++) else if (j > r) else if (aux[i-l] < aux[j-l]) else }}

public void shellsort(int a)else

}a[j + increment] = temp;}}

// for (int i : a)

// system.out.println();

}public void insertsort2(int a)

a[i] = temp;

}// for (int i : a)

// system.out.println();

}public static void main(string args)

}

歸併排序 o nlogn

與選擇排序等相比,歸併排序的時間複雜度是o nlogn 且是穩定的。原理 將所排序序列分成兩個子串行,遞迴呼叫函式將子串行排好序後,再合併。不足 需要乙個額外的陣列用於合併,造成空間的浪費。c語言實現 int extraarry 100000 intcmp int element1,int elem...

排序之歸併排序

歸併排序和快速排序的思想一樣,都是依據分治法 遞迴 兩者不同的是,歸併需要對子問題的解進行合併,即合併兩個已排序的表,合併的時間為線性的,最多進行了n 1次比較,其中n是元素的總數。歸併排序的基本思路就是將陣列分成二組a和b,如果這二組組內的資料都是有序的,那麼就可以很方便的將這二組資料進行排序。如...

排序之歸併排序

歸併排序還是有點雲裡霧裡 尤其是遞迴的時候的狀態樹與函式呼叫時的棧的狀態不太清楚,需要寫 加斷點做測試 先記錄下來,後面有時間再弄,先查到乙個用斷點測試後,描述歸併排序時遞迴狀態樹的部落格 其實如果按照 極客大學 演算法訓練營的覃超老師講的分治的模板,應該比較好寫出來 分治的模板 int divid...