Swift - 快速排序

demo下载地址

原理解析

快速排序(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]
发布了128 篇原创文章 · 获赞 106 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/Z1591090/article/details/102669256