快速排序-Swift实现
快速排序是一种分治的排序思想(类似归并,两者时间复杂度一样O(n log n),两者通常放在一起讨论),系统排序方法一般使用快速排序或堆排序去实现,如java的Collections.sort。
思想:从数组中随机抽取一个数(一般是取末尾的一个数),然后遍历一遍数组,把比这个数小的放在左边,比这个数大的放在右边;排好序后的数组左右两边也做和这个操作,最终条件到剩下一个数就终止,这时候就有序了。下面代码丢进去的数组是inout直接被改变的,而不是结果返回型的,直接用low和high操作这个数组就行。
快速排序对于归并排序,其最坏情况O(n^2),假如排序的数组本来就有顺序,还从最后面取数据,就会导致partition的下标不在中间,尽量让两边数量对齐。我们可以三数取中法(从数组收尾中取元素,比较拿出中间值的元素,并作为分区点),不一定要取最后一个。
归并排序为什么没有快速排序那么受欢迎?
相对于快速排序,归并排序每次分开数组都需要创建两个数组空间(100MB的数据就需要100MB的存储空间),日常生活中小数据可以使用归并排序,大数据处理快速排序更受欢迎。
**playground 代码 **
import UIKit
func sort(input :inout [Int]){
quicksort(input: &input, low: 0, high: input.count-1)
}
func quicksort(input :inout [Int],low : Int ,high : Int) ->[Int]
{
if low > high {
return input
}
let p = partition(input: &input, low: low , high : high)
quicksort(input: &input, low: low, high: p-1)
quicksort(input: &input, low: p+1, high: high)
return input
}
func partition(input :inout [Int] , low: Int , high : Int) -> Int{
var i = low
var j = i
let pivot = input[high]
for _ in low..<high
{
if input[j]<pivot {
input.swapAt(i, j)
i += 1
j += 1
}
else
{
j += 1
}
}
input.swapAt(i, high)
return i
}
var a = [3,4,5,2,1,9,10]
sort(input: &a)