Go语言快速排序

Posted 携壶酌流霞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言快速排序相关的知识,希望对你有一定的参考价值。

1、快速排序法的原理

快速排序法的原理也是分治法。它的每轮迭代,会选取数组中任意一个数据作为分区点,将小于它的元素放在它的左侧,大于它的放在它的右侧。再利用分治思想,继续分别对左右两侧进行同样的操作,直至每个区间缩小为 1,则完成排序。

2、快速排序法的性能

  • 在快排的最好时间的复杂度下,如果每次选取分区点时,都能选中中位数,把数组等分成两个,那么此时的时间复杂度和归并一样,都是 O(n*logn)。

  • 而在最坏的时间复杂度下,也就是如果每次分区都选中了最小值或最大值,得到不均等的两组。那么就需要 n 次的分区操作,每次分区平均扫描 n / 2 个元素,此时时间复杂度就退化为 O(n*n) 了。

  • 快速排序法在大部分情况下,统计上是很难选到极端情况的。因此它平均的时间复杂度是 O(n*logn)。

  • 快速排序法的空间方面,使用了交换法,因此空间复杂度为 O(1)。

很显然,快速排序的分区过程涉及交换操作,所以快排是不稳定的排序算法。
3、代码实现
package main
import "log"
func main() { arr := []int{2, 3, 4, 1, 23, 1, 78, 34, 3} log.Println("原始数据:", arr)
quickSort(arr, 0, len(arr)-1)
log.Println("排序后:", arr)}
// 快速排序func quickSort(arr []int, start, end int) { if start >= end { return } q := partition(arr, start, end) quickSort(arr, start, q-1) quickSort(arr, q+1, end)}
// 找到分区点func partition(arr []int, start, end int) int { i := start  // 选取最后一位数字作参考 pivot := arr[end] for j := start; j < end; j++ { if arr[j] < pivot { arr[i], arr[j] = arr[j], arr[i] i++ } } arr[i], arr[end] = arr[end], arr[i] return i}


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

Go语言快速排序

打造 Go 语言最快的排序算法

用Go实现冒泡排序选择排序和快速排序的运行效率比较

Go语言golang调用sort.Slice实现struct切片的快速排序

快速排序

图解算法基础--快速排序,附 Go 代码实现