1. 程式人生 > >(Swift 實現)排序 —— 歸併排序

(Swift 實現)排序 —— 歸併排序

我的理解,就是把大問題拆成小問題,然後再合併起來就醬
直接上程式碼,在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))

其實就是遞迴,分治合,三步就好了。
視覺化安利