Swift 經典演算法之快速排序

2021-10-08 09:23:13 字數 1653 閱讀 3652

快速排序:給基準資料找其正確索引位置的過程. 快排的時間複雜度是o(nlogn),空間複雜度是o(logn)

1、給乙個基準資料,一般是陣列第0個,即target = array[0]

2、從後半部分開始,如果掃瞄到的值大於基準資料就讓high減1,如果發現有元素比該基準資料的值小,就將high位置的值賦值給low位置

3、從前往後掃瞄,如果掃瞄到的值小於基準資料就讓low加1,如果發現有元素大於基準資料的值,就再將low位置的值賦值給high位置的值

4、直到low=high結束迴圈,此時low或high的下標就是基準資料target在該陣列中的正確索引位置

func quicksort(_ array: inout array, _ low: int, _ hight: int) -> void 

// 找尋基準資料的正確索引

let index = getcurrentindex(&array, low, hight)

quicksort(&array, low, index-1)

quicksort(&array, index+1, hight)

}func getcurrentindex(_ array: inout array, _ low: int, _ hight: int) -> int

// 如果隊尾元素小於tmp了,需要將其賦值給low

array[low] = array[hight]

while low < hight && array[low] <= target

// 當隊首元素大於tmp時,需要將其賦值給high

array[hight] = array[low];

}//替換陣列原數

array[low] = target

return low

}override func viewdidload()

測試結果:

排序後陣列:[-1, 0, 1, 2, 5, 8, 22, 22, 23, 38, 49, 65, 76, 97]
使用swift filter函式實現更簡單:

func quicksort(_ data: [t]) -> [t] 

let pivot = data[data.count/2]

let less = data.filter

let equel = data.filter

let greater = data.filter

return quicksort(less) + equel + quicksort(greater)

}//呼叫測試

var data = [1,55,3,11,2,77,34,6,32]

print(data.sorted())

print(quicksort(data))

排序結果:

[1, 2, 3, 6, 11, 32, 34, 55, 77]

經典排序演算法之快速排序

快排的思想是遞迴。一趟下來,比基數小的都在基數的左邊,比基數大的都在基數的右邊,然後分別對基數左邊的數進行遞迴,對右邊的數進行遞迴 當需要遞迴的元素只有乙個時,結束遞迴。public class quicksort quicksort arr,0,arr.length 1 for int a arr...

經典排序演算法之快速排序

快速排序就是通過一趟排序將原資料分成兩部分,其中一部分關鍵字都比另一部分小,接下來再對這兩部分分別使用快速排序,這裡有遞迴的思想。快速排序的平均時間複雜度為o nlgn 所以適合資料量較大的情況,但快排需要頻繁的對資料位置的操作,故不適合鏈式儲存資料。function sortquick arr,s...

經典演算法之快速排序

說明 快速排序是目前公認最快的排序方法之一。大部分情況都表現得很好,但當必須考慮最壞情況時,快速排序不可接受,因為時間達到o n2 思路 快速排序的基本思想是在數列中找出適當的軸心,將數列分成左右兩部分 左半部分的元素都小於右半部分的元素 然後分別對兩部分進行排序 重複選擇軸心,劃分左右部分的過程 ...