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...