算法之快速排序

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)

总结

快速算法是公认的所有排序算法中性能最好的,

以上是关于算法之快速排序的主要内容,如果未能解决你的问题,请参考以下文章

常用算法的简洁代码实现之快速排序归并排序

排序算法之快速排序

排序算法之快速排序

快速排序-递归实现

重温基础算法内部排序之快速排序法

重温基础算法内部排序之快速排序法