快速排序.jpg
快排Swift代碼如下,如果有疑問歡迎討論~
import Cocoa
class Sort {
/*
* array:傳入參數的數組,注意是傳址不是傳值
* p:排序區間起點下標
* r:排序區間終點點下標
*/
private func partition(_ array:inout [Int], _ p:Int, _ r:Int) -> Int {
let pivot = array[r] // 分界值,一般選數組排序區間末尾元素
var i:Int = p
for j in p...r-1 {
if array[j] < pivot{
array.swapAt(i, j) // 交換數組下標為 i、j 的元素
i += 1 // 有小于pivot的數字i++
}
}
// 交換 a[i] 與 a[r] 即:將pivot放到相應位置
array[r] = array[i]
array[i] = pivot
return i // 獲取分界值(pivot)排序后下標
}
/* array:傳入參數的數組,注意是傳址不是傳值
* p:排序區間起點下標
* r:排序區間終點點下標
*/
private func qucikSortC (_ array:inout [Int], _ p:Int, _ r:Int) -> [Int]{
// 需要排序的區間只包含一個數字,則不需要重排數組,直接返回
if p >= r {
return array
}
let i = partition(&array, p, r)
qucikSortC(&array, p, i-1)
qucikSortC(&array, i+1, r)
return array
}
public func quickSort(_ array: [Int]) -> [Int] {
var a = array
return qucikSortC(&a, 0, array.count-1)
}
}
測試用例:
var sort = Sort()
let result = sort.quickSort([6,11,3,9,8])
print(result)
控制臺輸出
[3, 6, 8, 9, 11]
注:
1,傳參部分要傳址,對原數組原地排序,也方便方法的return
2,partition()
函數部分,交換代碼循環結束后,還需要將分解值放入到準確對應的下標 i
處