[golang] 数据结构-快速排序
快速排序是个非常经典、高效、常用的排序算法。很多语言标准库里的排序算法都有用到它。 原理 快排原理其实比较简单,就是将原本很大的数组拆成小数组去解决问题。 要拆就得找个拆的位置。如果吧这个位置称为支点,那么快速排序问题就变成了不断的去找到拆分的支点元素位置。 通常找支点就是以某个元素为标准,通过交换元素位置把所有小于标准的元素都移到一侧,大于的移到另外一侧。移动元素的逻辑就是分别从最右侧元素向左找到比指定元素小的位置,再从最左侧开始向右找比指定元素大的位置。如果两个位置不相同就交换两个位置,在继续分表从两头相向寻找。找到合适的位置就是我们需要的支点。支点两边的元素再各自重复上面的操作,直到分拆出来的子数组只剩一个元素。分拆结束,顺序也就拍好了。 那么问题来了,以哪个元素为标准去比较呢?比如可以选第一个元素。 复杂度 理想情况下找到的支点可以把数组拆分成左右长度相近的子数组,此时时间复杂度为O(n*logn) 而最差情况则是每次找到的支点元素都在某一次,导致另一侧完全浪费,寻找支点的过程也浪费。这个时候用时会达到O(n^2)。 由于会打乱相同元素原有的顺序,所以快排也是一个不稳定排序。所以常用在普通类型数据的排序中。 代码实现 package main import ( "time" "fmt" "math/rand" ) func main() { var length = 10