swift演算法之排序 (五)歸併排序

2021-09-23 23:45:58 字數 2147 閱讀 9960

1、概述

歸併排序是建立在歸併操作上的一種有效的排序研發,該演算法主要是採用分治法(divide and conquer)的思想。

在歸併排序中,需要將排序的陣列進行拆分,將其拆分的足夠小,當拆分的陣列中只有乙個元素時,則拆分的陣列是有效的,然後將這些有序的陣列進行兩兩合併,並在合併的過程中進行比較,合併生成的新陣列仍然是有序的,然後再次將合併的有序陣列進行合併,重複這個過程,直到整個陣列都是有序的為止。

2、演算法原理

思想:分而治之,即將乙個大問題分解成較小的問題並解決他們,可以分為 先拆分 和 後合併,即 拆分+合併

步驟:1)將數字放在未排序的堆中

2)將堆分成兩部分,即兩個未排序的數字堆

3)繼續** 兩個未排序的數字堆,知道不能**為止,最後,你將擁有 n 個堆,每個堆中有乙個數字

4)通過順序配對,開始合併堆,在每次合併期間,將內容按排序順序排列

3、舉例

對 [2, 1, 5, 4, 9] 排序

1)將陣列元素拆分成5個單獨的陣列,每個陣列包含乙個元素

2)將拆分的陣列兩兩合併,並排序,直到整個陣列都是有序為止

4、演算法實現

1)自上而下的遞迴實現

拆分+合併

func mergesort(_ array: [int])->[int]

//2、找到中間索引

let middleindex = array.count/2

//3、使用上一步中的中間索引,遞迴的分割陣列的左側

let leftarray = mergesort(array(array[0..[int]else

}//4、如果前乙個while迴圈完成,意味著left/right中的乙個內容已經完全合併到orderpile中,不需要再比較,只需要依次新增剩下的陣列的剩餘元素

while leftindex < leftpile.count

while rightindex < rightpile.count

return orderedpile

}

2)自上而下的非遞迴實現

func mergesort1(_ array: [int])->[int]

//2、將陣列中的每乙個元素放入乙個陣列中

var tamparr : [[int]] =

for item in array

//3、對陣列中的陣列進行合併,直到合併完成為止

while tamparr.count != 1

}return tamparr.first!

}

3)自下而上的迭代實現

排序陣列時,跳過拆分步驟並立即開始合併各個陣列元素

func mergesortbottomup(_ array : [t], _ isorderedbefore:(t, t)->bool)->[t]else

j += 1

}while left4)呼叫

var array5 = [2, 1, 5, 4, 9]

//自上而下-遞迴

//array5 = mergesort(array5)

//自上而下-非遞迴

array5 = sortsummary.mergesort1(array5)

//自下而上-迭代

print(array5)

array5 = mergesortbottomup(array5,

執行結果:

[1, 2, 4, 5, 9]

[1, 2, 4, 5, 9]

5、時間複雜度最好、最差和平均情況的時間複雜度將始終為 o(nlogn)。

github**

注:排序的具體實現**在 sortsummary.swift 檔案裡 呼叫是在 viewcontroller.swift

演算法五之歸併排序

public class merge 呼叫遞迴先對陣列進行分組 static void sort int arr,int low,int hi int mid low hi low 2 sort arr,low,mid sort arr,mid 1,hi merge arr,low,hi,mid s...

排序 五 之歸併排序

歸併排序是乙個相當 穩定 的演算法對於其它排序演算法,比如希爾排序,快速排序和堆排序而言,這些演算法有所謂的最好與最壞情況。而歸併排序的時間複雜度是固定的,它是怎麼做到的?首先來看歸併排序要解決的第乙個問題 兩個有序的陣列怎樣合成乙個新的有序陣列,比如陣列1 3,5,7,8 陣列2為 1,4,9,1...

排序演算法之歸併排序

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