Swift实现快速排序

988 阅读2分钟

快速排序-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)