快速排序(快排Swift)

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。