快速排序

来源:互联网 发布:f22到底有多先进知乎 编辑:程序博客网 时间:2024/06/10 08:06

1、基本思想

1、从数组中选择一个数作为基准
2、分区过程,将把比这个数大的数全放到它的右边,小于它的数放在它的左边
3、再对左右区间进行第二步操作,直到他们区间只有一个数。

一次快排的具体操作:
第一步:取第一个和最后一个元素的指针,并设置一个基准值,比如可以把第一个元素设置为基准,(或者用更复杂的规则生成这个基准,这样有利于排序的稳定性,比如可以选用随机选取基准,或者中间取基准等)
第二步:从后开始往前比较,如果后面的数出现比基准小则放到左边的那个位置,
第三步:从前往后,如果出现比基准大的数则拿到后面取
第四部:把基准放在最后的剩余位置,如此往复

举例:

初始数组:data=[72 6 57 88 60 42 83 73 48 85]初始化:low=0,row=9 proiv=72 //取第一个元素第一步取出72作为基准,从后往前循环,直到出现第一个小于基准的值,则为48,则把48填充到data[i],i=0,i++第二步从前往后开始循环,直到出现第一个大于基准的值,为88,则把88填充到data[j],j=8,重复第一步,直到出现low==row的时候按基准值进行分割,前半部分继续如此,后半部分也如此

2、具体代码实现如下

//data为要排序的数据,low为左边界下标,row为右边界下标func QuickSort(data []int, low, row int) {    if low < row {        i, j, x := low, row, data[low]        for i < j {            for i < j && data[j] > x {  //从右往左寻找比基准小的数                j--            }            if i < j {                data[i] = data[j]                i++            }            for i < j && data[i] < x {  //从左往右寻找比基准大的数                i++            }            if i < j {                data[j] = data[i]                j--            }        }        data[i] = x        QuickSort(data, low, i-1)        QuickSort(data, i+1, row)    }}

sort源码包中的快排实现进过了优化,在元素较少是使用堆排或者希尔插入来排序,为了减少递归深度。

查看博客:

1、白话经典算法系列之六 快速排序 快速搞定

1 0
原创粉丝点击