クイックソートアルゴリズムは「速い」ことで有名で、その優れた時間計算量から業界では古典的なソートアルゴリズムとみなされており、面接でもよく使われています。 、それは素晴らしいボーナスになります。
クイック ソート アルゴリズムは難しいものではなく、二分探索と分割統治の考え方を使用して問題の境界を分割し、より小さな問題に変換して解決します。
迅速:
import Foundation
var arr = [10,9,8,7,6,4,5,3,2,1]
quickSort(array: &arr, startIndex: 0, endIndex: arr.count - 1)
print(arr)
/*
快速排序主函数 二分查找、分治思想
*/
func quickSort (array: inout [Int], startIndex: Int, endIndex: Int) {
if startIndex > endIndex {
return }
let mid = partition(array: &array, startIndex: startIndex, endIndex: endIndex)
quickSort(array: &array, startIndex: startIndex, endIndex: mid - 1) //左区间分治
quickSort(array: &array, startIndex: mid + 1, endIndex: endIndex) //右区间分治
}
/*
分治函数
@return 分隔左右区间的index
保证 arr[index] > index左边的数,arr[index] < index右边的数
*/
func partition (array: inout [Int], startIndex: Int, endIndex: Int) -> Int {
var left = startIndex
var right = endIndex
let standNum = array[startIndex] //找到基准数(也称哨兵)
while left < right {
//从右到左 找到第一个小于 基准数 的数
while left < right, array[right] >= standNum {
//这里要有等号,防止排序数组中出现重复数字陷入死循环
right -= 1
}
array[left] = array[right]
//从左到右 找到第一个大于 基准数 的数
while left < right, array[left] <= standNum {
left += 1
}
array[right] = array[left]
}
array[left] = standNum
return left
}
出力結果:
時間計算量: O(n log(n))