Swift實現快速排序

樑華建發表於2019-03-01

快速排序-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)

複製程式碼

相關文章