原地排序的快排算法(Swift實現)

原地排序, 分界點選取最後一個元素

/// 原地分區函數(array: 待分區數組, p: 起始下標, r: 結束下標)
private func partition(_ array: inout [Int], _ p: Int, _ r: Int) -> Int {
    let pivot = array[r]
    var i = p
    for j in p...r-1 {
        if array[j] < pivot {
            // 交換數組下標爲 i、j 的元素
            array.swapAt(i, j)
            i += 1
        }
    }
    array.swapAt(i, r);
    return i
}

/// 快速排序算法
public func qucikSort(_ array: inout [Int], _ p: Int, _ r: Int) -> [Int] {
    // 需要排序的區間只包含一個數字,則不需要重排數組,直接返回
    if p >= r { return array }
    let i = partition(&array, p, r)
    qucikSort(&array, p, i-1)
    qucikSort(&array, i+1, r)
    return array
}

原地排序, 分界點選取第一個元素

/// 原地分區函數(array: 待分區數組, p: 起始下標, r: 結束下標)
private func partition(_ array: inout [Int], _ p: Int, _ r: Int) -> Int {
    let pivot = array[p]
    var i = p, j = r
    while i != j {
        // 先從右向左找小於pivot的數(order is important)
        while array[j] >= pivot && i < j {
            j -= 1
        }
        // 再從左往右找大於pivot的數
        while array[i] <= pivot && i < j {
            i += 1
        }
        if i < j {
            array.swapAt(i, j);
        }
    }
    // 找到分界點在數組中的位置, 並與"雀佔鳩巢"者交換
    array.swapAt(p, i);
    return i
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章