Swift 经典算法之快速排序

原理:

快速排序:给基准数据找其正确索引位置的过程. 快排的时间复杂度是O(nlogn),空间复杂度是O(logn)

1、给一个基准数据,一般是数组第0个,即target = array[0]

2、从后半部分开始,如果扫描到的值大于基准数据就让high减1,如果发现有元素比该基准数据的值小,就将high位置的值赋值给low位置

3、从前往后扫描,如果扫描到的值小于基准数据就让low加1,如果发现有元素大于基准数据的值,就再将low位置的值赋值给high位置的值

4、直到low=high结束循环,此时low或high的下标就是基准数据target在该数组中的正确索引位置

    func quickSort(_ array: inout Array<Int>, _ low: Int, _ hight: Int) -> Void {
        // 需要排序的区间只包含一个数字,则不需要重排数组,直接返回
        if low >= hight {
            return
        }
        // 找寻基准数据的正确索引
        let index = getCurrentIndex(&array, low, hight)
        quickSort(&array, low, index-1)
        quickSort(&array, index+1, hight)
    }
    func getCurrentIndex(_ array: inout Array<Int>, _ low: Int, _ hight: Int) -> Int {
        //基准数据
        let target = array[low]
        var low = low
        var hight = hight
        while low < hight {
            // 当队尾的元素大于等于基准数据时,向前挪动high指针
            while low < hight && array[hight] >= target {
                hight = hight-1
            }
            // 如果队尾元素小于tmp了,需要将其赋值给low
            array[low] = array[hight]
            
            while low < hight && array[low] <= target {
                low = low+1
            }
            // 当队首元素大于tmp时,需要将其赋值给high
            array[hight] = array[low];
        }
        //替换数组原数
        array[low] = target
        return low
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        var dataArray = [49, 38, 65, 97, 23, 22, 76, 1, 5, 8, 2, 0, -1, 22]
        
        quickSort(&dataArray, 0, dataArray.count-1)
        print("排序后数组:\(dataArray)")
    }

测试结果:

排序后数组:[-1, 0, 1, 2, 5, 8, 22, 22, 23, 38, 49, 65, 76, 97]

使用Swift filter函数实现更简单:

   func quickSort<T: Comparable>(_ data: [T]) -> [T] {
        guard data.count > 1 else {
            return data
        }
        let pivot = data[data.count/2]
        let less = data.filter {
            $0 < pivot
        }
        let equel = data.filter {
            $0 == pivot
        }
        let greater = data.filter { (ff) -> Bool in
            ff > pivot
        }
        
        return quickSort(less) + equel + quickSort(greater)
    }

   //调用测试
   var data = [1,55,3,11,2,77,34,6,32]
        
       print(data.sorted())
       print(quickSort(data))

排序结果:

[1, 2, 3, 6, 11, 32, 34, 55, 77]

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值