十大經典排序演算法(五 歸併排序)

2022-07-08 04:42:12 字數 1905 閱讀 6016

歸併排序(merge sort)是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。

作為一種典型的分而治之思想的演算法應用,歸併排序的實現由兩種方法:

和選擇排序一樣,歸併排序的效能不受輸入資料的影響,但表現比選擇排序好的多,因為始終都是 o(nlogn) 的時間複雜度。代價是需要額外的記憶體空間。

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

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

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

重複步驟 3 直到某一指標達到序列尾;

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

1

function mergesort(arr)

6var middle = math.floor(len / 2),

7 left = arr.slice(0, middle),

8 right =arr.slice(middle);

9return

merge(mergesort(left), mergesort(right));10}

1112

function

merge(left, right)

13 else22}

2324

while

(left.length)

25result.push(left.shift());

2627

while

(right.length)

28result.push(right.shift());

2930

return

result;

31 }

1

defmergesort(arr):

2import

math

3if(len(arr)<2):

4return

arr5 middle = math.floor(len(arr)/2)

6 left, right =arr[0:middle], arr[middle:]

7return

merge(mergesort(left), mergesort(right))89

defmerge(left,right):

10 result =

11while left and

right:

12if left[0] <=right[0]:

1314

else:15

16while

left:

1718

while

right:

1920

return result

1

void merge_sort_recursive(int arr, int reg, int start, int

end)

1920

void merge_sort(int arr, const

intlen)

1

void merge(vector &array, int front, int mid, int

end) else16}

17}1819

void mergesort(vector &array, int front, int

end)

十大經典排序演算法

載自 排序演算法是 資料結構與演算法 中最基本的演算法之一。排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序演算法有 插入排序 希爾排序 選擇排序 氣泡排序 歸併排序 快速排...

十大經典排序演算法

不穩定排序種類為4種 快速排序 核心思想是partition操作 二分法分而治之 平均時間複雜度nlogn 希爾排序 高階版的插入排序,先把間隔較遠的子串行排序,最後間隔為1時,等同於插入排序 插入排序在序列有序時,時間複雜度常數級,所以先讓子串行總體有序,能有效降低時間複雜度 平均時間複雜度n 1...

十大經典排序演算法

常見經典排序 非線性時間比較類排序 通過比較來決定元素間的相對次序,由於其時間複雜度不能突破o nlogn 因此稱為非線性時間比較類排序。線性時間非比較類排序 不通過比較來決定元素間的相對次序,它可以突破基於比較排序的時間下界,以線性時間執行,因此稱為線性時間非比較類排序。時間複雜度 空間複雜度 穩...