
快速排序算法是一种时间复杂度为O(nlogn)的算法。
func swap(array:inout [Int], _ leftIndex:Int, _ rightIndex:Int) {
let temp = array[leftIndex]
array[leftIndex] = array[rightIndex]
array[rightIndex] = temp
return
}
func quickSort(mArray:inout [Int], _ startIndex:Int, _ endIndex:Int) -> [Int] {
guard mArray.count > 1 else {
return mArray
}
var pivotIndex = endIndex //选最后位置为中心数(pivot)
var leftIndex = startIndex
var rightIndex = endIndex - 1
// 如果左右游标相遇,则停止扫描
while (leftIndex != rightIndex) {
// 移动左游标, 找到一个大于 pivot 的值
while (leftIndex < rightIndex && mArray[leftIndex] < mArray[pivotIndex]) {
leftIndex += 1
}
// 移动右游标,找到一个小于 pivot 的值
while (leftIndex < rightIndex && mArray[rightIndex] > mArray[pivotIndex]) {
rightIndex -= 1
}
swap(array: &mArray, leftIndex, rightIndex)
}
//最后交换 left 和 pivot,使得 pivot 左边都是小于 pivot 的,右边都是大于 pivot
if (mArray[leftIndex] > mArray[pivotIndex]) {
swap(array: &mArray, leftIndex, pivotIndex)
pivotIndex = leftIndex //如果发生交换,中心的位置变成了左右游标相遇的位置
}
if (startIndex < pivotIndex - 1) {
// print("游标左边:")
quickSort(mArray: &mArray, startIndex, pivotIndex - 1)
}
if ((pivotIndex + 1) < endIndex) {
// print("游标右边:")
quickSort(mArray:&mArray, pivotIndex + 1, endIndex)
}
return mArray
}
测试用例:
var mArray = [3,1,2,7,9,4,8,5,6]
print(quickSort(mArray: &mArray, 0, mArray.count - 1))
网友评论