排序算法: 快速排序

324 阅读1分钟

一.简介

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,快速排序思想----分治法也确实实用。
基本思想是:

  • 先从数列中取出一个数作为基准数。
  • 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
  • 再对左右区间重复第二步,直到各区间只有一个数。

二.代码栗子

```kotlin
object Demo {

    /**
     * 快速排序
     *
     * @param arr 数组
     * @param left 最左边元素下标
     * @param right 最右边元素下标
     */
    fun quickSort(arr: IntArray, left: Int, right: Int) {
        if (left > right)
            return

        var temp: Int
        var i = left // 哨兵i
        var j = right // 哨兵j
        val datum = arr[left] // 以最左边的元素为基准数
        while (i < j) {
            // 从右往左找, 小于datum(基准数)的元素
            while (datum <= arr[j] && i < j) j--
            // 从左往右找, 大于datum(基准数)的元素
            while (datum >= arr[i] && i < j) i++

            // 当哨兵i和哨兵j没有相遇时
            // 交换两个元素在数组中的位置
            if (i < j) {
                temp = arr[i]
                arr[i] = arr[j]
                arr[j] = temp
            }
        }
        // 最后 哨兵i和哨兵j相遇, 再将基准为和i位置元素交换
        arr[left] = arr[i]
        arr[i] = datum

        println("Arr: ${arr.contentToString()}")

        //继续处理左边的,这里是一个递归的过程
        quickSort(arr, left, i - 1)

        //继续处理右边的,这里是一个递归的过程
        quickSort(arr, i + 1, right)
    }
}

fun main() {
    val nums = intArrayOf(5, 1, 8, 6, 4, 2, 3, 7, 9)
    val left = 0
    val right = nums.size - 1
    Demo.quickSort(nums, left, right)
    println("结果: ${nums.contentToString()}")
}
```
  • 运行结果
    Arr: [4, 1, 3, 2, 5, 6, 8, 7, 9]
    Arr: [2, 1, 3, 4, 5, 6, 8, 7, 9]
    Arr: [1, 2, 3, 4, 5, 6, 8, 7, 9]
    Arr: [1, 2, 3, 4, 5, 6, 8, 7, 9]
    Arr: [1, 2, 3, 4, 5, 6, 8, 7, 9]
    Arr: [1, 2, 3, 4, 5, 6, 8, 7, 9]
    Arr: [1, 2, 3, 4, 5, 6, 7, 8, 9]
    Arr: [1, 2, 3, 4, 5, 6, 7, 8, 9]
    Arr: [1, 2, 3, 4, 5, 6, 7, 8, 9]
    结果: [1, 2, 3, 4, 5, 6, 7, 8, 9]
    

三.相关资料