(Swift 實現)排序 —— 歸併排序
阿新 • • 發佈:2018-12-23
我的理解,就是把大問題拆成小問題,然後再合併起來就醬
直接上程式碼,在Swift執行一遍就看見了,終於想出來了,在playground裡面執行,又快又方便呢。
import UIKit
var str = "Hello, playground"
var a = [22,13,5,1,23,4,23,1,23,4,12,54,56,56,34,523,2134,12,21]
//這個我想的先把陣列分開,分成一個一個的。
func paixu(_ leftIndex:Int,_ rightIndex:Int) -> (Array<Int>) {
if leftIndex < rightIndex
{
//這個最少也有兩個,那就接著往下分
let i = (rightIndex+leftIndex)/2
//這裡就碰見遞迴了,paixu這個方法會一直下去,知道剩了一個,那最極端的就是aa裡面只有一個元素,bb也是
var aa = Array(paixu(leftIndex, i))
var bb = Array(paixu(i+1, rightIndex))
aa.append(Int.max)
bb.append(Int.max)
//返回已排好的序的陣列,返回到上一層的paixu這,緊接著又一輪,直到最初的那個paixu。
return paixushuzu(aa, bb)
}else
{
return [a[rightIndex]]
//這個顯然就是一個返回單個值
}
}
//這個方法是給定的兩個排好序的陣列,我會給合在一起,並且按著從小到大的排列
func paixushuzu(_ Arra:Array<Int>,_ Arrb:Array<Int>) -> (Array<Int>) {
//給定新陣列c
var c = [Int]()
var aa = 0 //計數Arra的下標
var bb = 0 //計數Arrb的下標
//這個條件很巧妙,只有c的個數等於了他們兩個陣列個數的和才會停止
while c.count < Arrb.count+Arra.count-2 {
//誰大取誰,接著下一個
if Arra[aa] < Arrb[bb]
{
c.append(Arra[aa])
if aa < Arra.count
{
aa+=1
}
}
else
{
c.append(Arrb[bb])
if bb < Arrb.count
{
bb+=1
}
}
}
//返回排好序的陣列
return c
}
print(paixu(0, a.count-1))
其實就是遞迴,分治合,三步就好了。
視覺化安利