快速排序-Swift實現
快速排序是一種分治的排序思想(類似歸併,兩者時間複雜度一樣O(n log n),兩者通常放在一起討論),系統排序方法一般使用快速排序或堆排序去實現,如java的Collections.sort。
思想:從陣列中隨機抽取一個數(一般是取末尾的一個數),然後遍歷一遍陣列,把比這個數小的放在左邊,比這個數大的放在右邊;排好序後的陣列左右兩邊也做和這個操作,最終條件到剩下一個數就終止,這時候就有序了。下面程式碼丟進去的陣列是inout直接被改變的,而不是結果返回型的,直接用low和high操作這個陣列就行。
快速排序對於歸併排序,其最壞情況O(n^2),假如排序的陣列本來就有順序,還從最後面取資料,就會導致partition的下標不在中間,儘量讓兩邊數量對齊。我們可以三數取中法(從陣列收尾中取元素,比較拿出中間值的元素,並作為分割槽點),不一定要取最後一個。
歸併排序為什麼沒有快速排序那麼受歡迎?
相對於快速排序,歸併排序每次分開陣列都需要建立兩個陣列空間(100MB的資料就需要100MB的儲存空間),日常生活中小資料可以使用歸併排序,大資料處理快速排序更受歡迎。
**playground 程式碼 **
import UIKit
func sort(input :inout [Int]){
quicksort(input: &input, low: 0, high: input.count-1)
}
func quicksort(input :inout [Int],low : Int ,high : Int) ->[Int]
{
if low > high {
return input
}
let p = partition(input: &input, low: low , high : high)
quicksort(input: &input, low: low, high: p-1)
quicksort(input: &input, low: p+1, high: high)
return input
}
func partition(input :inout [Int] , low: Int , high : Int) -> Int{
var i = low
var j = i
let pivot = input[high]
for _ in low..<high
{
if input[j]<pivot {
input.swapAt(i, j)
i += 1
j += 1
}
else
{
j += 1
}
}
input.swapAt(i, high)
return i
}
var a = [3,4,5,2,1,9,10]
sort(input: &a)
複製程式碼