美文网首页
快速排序 Swift 一个萝卜一个坑解法

快速排序 Swift 一个萝卜一个坑解法

作者: 派大星的博客 | 来源:发表于2018-11-17 01:02 被阅读7次

原理:

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

步骤:

  • 从数列中挑出一个元素,称为"基准"(pivot)

  • 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)

  • 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。

标准理解版实现:

var array = [5, 8, 5, 7, 41, 2, 43, 6, 601, 61, 52, 33, 6, 7, 61, 1, 3, 6, 31, 2, 30, 6]

func quickSort(start: Int, end: Int) {
    if start >= end {
        return
    }
    else if end - start == 1 {
        if array[start] > array [end] {
            let tmp = array[start]
            array[start] = array [end]
            array[end] = tmp
        }
        return
    }
    else {
        var tmpIndex = start
        let povit = array[start]
        var left = start + 1
        var right = end
        var moveRight = true
        
        while left <= right {
            if moveRight {
                while (array [right] > povit && left <= right) {
                    right -= 1
                }
                array[tmpIndex] = array [right]
                tmpIndex = right
                right -= 1
                moveRight = false
                continue
            } else {
                while (array [left] <= povit && left <= right) {
                    left += 1
                }
                array[tmpIndex] = array [left]
                tmpIndex = left
                left += 1
                moveRight = true
                continue
            }
        }
        array[tmpIndex] = povit
        quickSort(start: start, end: tmpIndex - 1)
        quickSort(start: tmpIndex + 1, end: end)
    }
}

let _ = quickSort(start: 0, end: array.count - 1)
print(array)

优化精简版实现:

func quickSort(start: Int, end: Int) {
    if start >= end { return }
    var left = start
    var right = end
    let povit = array[start]
    while left < right {
        while (array [right] > povit && left < right) {
            right -= 1
        }
        if left < right {
            array[left] = array [right]
        }
        while (array [left] <= povit && left < right) {
            left += 1
        }
         if left < right {
            array[right] = array [left]
        }
    }
    array[left] = povit
    quickSort(start: start, end: left - 1)
    quickSort(start: left + 1, end: end)
}

快速排序 Swift之Array.filter(高阶函数)实现

走过、路过: 请多指教!

相关文章

  • top k

    解法一 最简单的,多次循环 解法二:快速排序

  • 快速排序 Swift 一个萝卜一个坑解法

    原理: 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(su...

  • 双向链表的快速排序(swift版本)

    面试经常会被问到的单向链表的快速排序or双向链表的快速排序,现在用swift写了一个双向链表的快速排序,直接上代码...

  • swift中几种排序算法原理的UI动态实现

    swift中的排序算法总结 冒泡排序 选择排序 快速排序 插入排序 堆排序 归并排序 系统排序 我们将这几种数组排...

  • swift 快速排序

    快速排序 基本原理: 把待排序数组取出一个元素,对整个元素进行比较,把应该排在该元素前面的都放在左侧,放在后面的都...

  • Swift 快速排序

    快速排序是很常见的算法, 那么Swift要如何实现呢? 下面提供了一种思路

  • [中等] 147. 对链表进行插入排序

    欢迎关注 leetcode 专栏 题目 解法常规解法Python 专属解法 题目 对链表进行插入排序。 插入排序的...

  • swift sorted 排序函数

    swift 提供了便捷的快速排序数组、字典的函数 sorted( )所有操作都在 swift 3.0 下完成 1....

  • 数组的排序

    系统提供的排序方法,我觉得应该是快速排序方法的封装 OC swift 还有其他排序的方法,可参考文章:iOS 数组...

  • iOS知识点-12.用 Swift 实现或(||)操作

    Swift Basics 用 Swift 实现或(||)操作 这题解法很多,下面给出一种最直接的解法: 上面这种解...

网友评论

      本文标题:快速排序 Swift 一个萝卜一个坑解法

      本文链接:https://www.haomeiwen.com/subject/jgtbfqtx.html