forked from go/golangs_learn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.9 KiB
65 lines
1.9 KiB
3 years ago
|
# 快速排序
|
||
|
|
||
|
* **介绍**
|
||
|
* 复杂度O(n log(n))
|
||
|
* 思路:取一个元素p(第一个元素),使元素p`归位`; 列表被p分成两部分,左边都比p小,右边都比p大; 递归完成排序.
|
||
|
* 过程: `锁定`从右边找第一个数值p,先从右边找比p小的数,把右边的值写到左边空位上;然后从左边找比p大的数,把左边的值写到右边空位上; 依次取完所有的数值.
|
||
|
* 关键字:
|
||
|
* `归位`获取中数的下标
|
||
|
* 归位是指将列表通过两端对调比一个值的方式,将数组分成关于每个数对称的两部分和一个中间值。
|
||
|
* 目的:使目标具有一致性和折半处理的格式。
|
||
|
* 递归
|
||
|
* 存在问题
|
||
|
* 最坏情况存在(`优化`:加入随机替换)
|
||
|
* 极端情况下排序效率低
|
||
|
* 快速排序 `>` 归并排序 `>` 堆排序
|
||
|
* **原理**
|
||
|
|
||
|
>
|
||
|
|
||
|
* **代码**
|
||
|
|
||
|
```go
|
||
|
/**
|
||
|
Quick 实现快速排序 O(n * log(n))
|
||
|
a : 被排序数组
|
||
|
返回:排序完毕数组
|
||
|
*/
|
||
|
func Quick(slice []int, left, right int) []int {
|
||
|
if left < right {
|
||
|
mid := partition(slice, left, right) // 获取归位中值
|
||
|
Quick(slice, left, mid-1) // 操作 中值 左边数组
|
||
|
Quick(slice, mid+1, right) // 操作 中值 右边数组
|
||
|
}
|
||
|
return slice
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
partition 归位函数,获取一个关于某值对称的数组和中间值
|
||
|
*/
|
||
|
func partition(slice []int, left, right int) int {
|
||
|
tmp := slice[left] // 获取左侧第一个数
|
||
|
for left < right {
|
||
|
// 进行逐个实现归位操作,将列表形成一个对称列表
|
||
|
// 左边比 tmp 大的数,调至右边
|
||
|
for left < right && slice[right] >= tmp {
|
||
|
right--
|
||
|
}
|
||
|
slice[left] = slice[right]
|
||
|
|
||
|
// 右边比 tmp 小的数,调至左边
|
||
|
for left < right && slice[left] <= tmp {
|
||
|
left++
|
||
|
}
|
||
|
slice[right] = slice[left]
|
||
|
}
|
||
|
slice[left] = tmp
|
||
|
return left
|
||
|
}
|
||
|
```
|
||
|
|
||
|
* **过程**
|
||
|
|
||
|
![快速](.\img\快速排序.gif)
|
||
|
|
||
|
![快速排序示例图](.\img\快速排序示例图.png)
|