原理解析
快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
问题描述:
把数组 [49, 38, 65, 97, 76, 13, 27, 49, 55, 04] 进行从小到大进行排序
解题步骤
步骤:
- 从数列中挑出一个元素,称为 “基准”(pivot),
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
代码:
// 快速排序
func p_quickSort(array: inout [Int], low: Int ,high: Int) -> [Int] {
guard array.count > 1 else {
return array
}
if low < high { // 长度大于1
let pivot = partiton(array: &array, low: low, high: high)
p_quickSort(array: &array, low: low, high: pivot - 1)// 对枢轴之前的子序列递归快排
p_quickSort(array: &array, low: pivot + 1, high: high)// 对枢轴之后的子序列递归快排
}
return array
}
//进行一次划分,并返回枢轴的最终位置
func partiton(array: inout [Int] , low: Int, high: Int) -> Int {
var left = low, right = high // 设置左右起点
let x = array[low]//设置枢轴
repeat {//left 和 right 从待排序的两端交替的向中间移动
while (array[right] > x) && (left < right) {//从左往右栈,找出比枢轴小的数
right -= 1
}
while (array[left] <= x) && (left < right) { // 从左往左找, 找出比枢轴大的数
left += 1
}
if left < right {
array.swapAt(left, right) //交换操作
}
} while left < right
// 枢轴移到正确位置
if low != right { // 防止交换位置相同
array.swapAt(low, right) // 将枢轴和左边有序区的的最后一个数交换,此时为right的位置
}
return left // 返回枢轴的最终位置
}
测试:
@objc func quickSort()
{
var sortArray = [49, 38, 65, 97, 76, 13, 27, 49, 55, 04]
let result = p_quickSort(array: &sortArray, low: 0, high: sortArray.count-1)
print(result)
}
结果:
[4, 13, 27, 38, 49, 49, 55, 65, 76, 97]