排序演算法之歸併排序

2022-06-19 07:33:10 字數 1609 閱讀 7539

歸併排序,是建立在歸併操作上的一種有效的排序演算法。演算法是採用分治法(divide and conquer)的乙個非常典型的應用,且各層分治遞迴可以同時進行。歸併排序思路簡單,速度僅次於快速排序,為穩定排序演算法,一般用於對總體無序,但是各子項相對有序的數列。

歸併排序是用分治思想,分治模式在每一層遞迴上有三個步驟:

分解(divide):將n個元素分成個含n/2個元素的子串行。

解決(conquer):用合併排序法對兩個子串行遞迴的排序。

合併(combine):合併兩個已排序的子串行已得到排序結果。

迭代法① 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列

② 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置

③ 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置

④ 重複步驟③直到某一指標到達序列尾

⑤ 將另一串行剩下的所有元素直接複製到合併序列尾

遞迴法① 將序列每相鄰兩個數字進行歸併操作,形成floor(n/2)個序列,排序後每個序列包含兩個元素

② 將上述序列再次歸併,形成floor(n/4)個序列,每個序列包含四個元素

③ 重複步驟②,直到所有元素排序完畢

//歸併排序

2static

class mergesort implements

sort

8@override

9public

comparable sort(comparable data)

16//

遞迴體17

private

static

void sort(comparable data, int lo, int

hi)

24//

合併25

private

static

void merge(comparable data, int lo, int mid, int

hi) else35}

36//

遍歷,如果p1指標沒有走完,那麼順序移動p1指標,把對應的元素放到輔助陣列的對應索引處

37while(p1 <=mid)

40//

遍歷,如果p2指標沒有走完,那麼順序移動p1指標,把對應的元素放到輔助陣列的對應索引處

41while(p2 <=hi)

44//

把輔助陣列中的元素拷貝到原陣列中

45for(int index = lo; index <= hi; index++) 48}

49 }

這個關係式的含義是,對長度為

的陣列進行排序的時間複雜度等於對兩個長度為

的陣列排序的時間複雜度,再加上分割和歸併的時間複雜度

。根據前面的公式,我們可以得到歸併排序的時間複雜度為

。由於歸併過程需要長度為

的空陣列,所以歸併排序的空間複雜度為

。歸併排序演算法中,歸併最後到底都是相鄰元素之間的比較交換,並不會發生相同元素的相對位置發生變化,故是穩定性演算法。

排序演算法之歸併排序

歸併排序也是經典的使用分治法思想的代表演算法之一。歸併排序的效率很高,而且是一種穩定的排序。其總體的思想思路就是將待排序的元素分成大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排序的子集合合併成排好序的總集合 歸併排序c 實現如下 include void mergesort int arr...

排序演算法之歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。歸併排序基本原理 通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。歸併排序基本思...

排序演算法之歸併排序

歸併排序,和快排一樣同樣採用了分治的思想,將兩個 或以上 有序表合併成乙個新的有序表。歸併排序步驟如下 把n個記錄看成 n個長度為 1 的有序子表 進行兩兩歸併使記錄關鍵字有序,得到 n 2 個長度為 2 的有序子表 重複第2步直到所有記錄歸併成乙個長度為n的有序表為止。下面是歸併排序演算法的遞迴實...