一.简介
快速排序由于排序效率在同为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]