最近像在看闲书同样在看一本《啊哈!算法》算法
当时在amazon上面闲逛挑书,看到巨多人推荐这本算法书,说深刻浅出简单易懂便买来阅读。实际上做者描述算法的能力的确使人佩服。就当复习经常使用算法吧。数组
后面会依次纪录一下我以为有意思的经常使用算法使用,此次就是快排。函数
快速排序简介:ui
快排的中心思想仍是二分法,经过partition算法,先将须要排序的数组分为两个部分,再用递归的思想反复这个过程。最后将排序好的最小单元再依次组装起来得到最后的数据。快排的平均时间复杂度是O(nlogN),最糟糕的状况是O(N平方)。spa
Partition算法:指针
partition算法是一种分类算法,简单来讲就把一个序列分红先后两部分,前一部分都是知足某一条件的元素,后一部分都是不知足该条件的元素。最著名的应用可能就是快速排序中的partition了。咱们先找出一个元素,而后以该元素为基准点将小于他的所有放置到一边,将大于他的数所有放置到另一边。最后返回pivot索引位置。这里咱们默认使用数组的第一个数做为pivot
code
下面来看快速排序中partition的实现:blog
func partition(left int, right int, list []int) (int) { i := left j := right temp := list[left] for i != j { for i < j && list[j] >= temp { j-- } for i < j && list[i] <= temp { i++ } if i < j { list[i], list[j] = list[j], list[i] } } list[left], list[i] = list[i], list[left]
return i }
咱们接收数组,左起始点,右结束索引做为参数。排序
默认将数组的第一个数做为索引点,而后将小于他的数放置在左边,将大于他的数放置在右边。递归
快速排序:
经过递归partition函数咱们就能始终将数分红左右两边,最后再合并起来就能够了。
因此实际快速排序只是在partition算法的基础上使用递归法。最后获取结果。上面的partition算法我使用了两根指针同时从左右两边进行扫描。把扫描到的左右两个数调换位置,从而二分效率。
完整的代码:
func quickSort(left int, right int, list []int) { if left >= right { return } i := left j := right temp := list[left] for i != j { for i < j && list[j] >= temp { j-- } for i < j && list[i] <= temp { i++ } if i < j { list[i], list[j] = list[j], list[i] } } list[left], list[i] = list[i], list[left] quickSort(left, i, list) quickSort(i+1, right, list) return }
Reference:
《啊哈!算法》-> 啊哈磊著