算法之快速排序
Posted 架构师优雅之道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法之快速排序相关的知识,希望对你有一定的参考价值。
基本思想
选择基准数
将比基准数小的值放到基准数的左侧,比基准数大的值放到基准数的右侧
对左右区间的数据重复执行上述操作,直到每个区间的元素少于1个
具体流程如下
动图展示
递归代码实现
func quickSort(nums []int) {
if len(nums) <= 1 {
return
}
_quickSort(nums, 0, len(nums)-1)
}
func _quickSort(nums []int, left, right int) {
if right > left {
mid := partition(nums, left, right)
_quickSort(nums, left, mid-1)
_quickSort(nums, mid+1, right)
}
}
func partition(nums []int, left, right int) int {
tmp := nums[left] //基准数
for right > left {
for right > left && nums[right] >= tmp { //从right端向前找比tmp小的数
right--
}
nums[left] = nums[right] //交换值
for right > left && nums[left] <= tmp { //从left端向后找比tmp大的数
left++
}
nums[right] = nums[left] //交换值
}
nums[left] = tmp //for结束后,left=right,将基准数写到left位置
return left
}
时间复杂度分析
最差情况
每次选择基准数是数组中最大或者最小的,因此我们会进行n-1次的划分,在第 i 次划分时,区间长度为n-i+1 ,需要进行 n-i 次比较,故时间复杂度为O(n^2)
平均情况
为改善最坏情况下的时间性能,可采用其他方法选取中间数。通常采用“三者值取中”方法,即比较H->r[low].key、H->r[high].key与H->r[(low+high)/2].key,取三者中关键字为中值的元素为中间数,时间复杂度为
最好情况
每次所取的基准就是该数组的中点,因此一共需要进行n次划分,对于 长度为的划分空间,需要进行 n-1 次比较。剩下的两个无序子区间需要进行2C(n/2) 的比较次数。故时间复杂度为O(nlogn)
总结
快速算法是公认的所有排序算法中性能最好的,
以上是关于算法之快速排序的主要内容,如果未能解决你的问题,请参考以下文章