快速排序
快速排序和递归排序有类似之处,但快速排序是先排序找边界,通过边界分组递归排序,所以快速排序总体分为两部:
1、寻找哨兵 pivot
,其左侧的元素都小于它,右侧的元素大于它,采用填坑法,一般先将数组头部定义为pivot
并将其取出(其余留位置为一个“坑”)
2、递归,简单的递归排序
func sortArray(nums []int,left,right int) {
//埋坑,比哨兵小的埋入left指针坑,哨兵大的买入right指针坑
//第一递归的边界条件,递归数组长度须>0
if left > right{
return
}
//定义一个哨兵,取左侧第一位
pivot := nums[left]
i,j := left,right
//遍历条件
for i < j{
//先右指针遍历,若大于哨兵,左移
for nums[j] >= pivot && i<j{
j--
}
//若小于哨兵,填坑
nums[i] = nums[j]
//同理左指针遍历,若小于哨兵,右移
for nums[i] <= pivot && i<j{
i++
}
nums[j] = nums[i]
}
//哨兵填入剩余坑中,完成第一次排序
nums[i] = pivot
//以哨兵为界限,分别递归左右两侧
sortArray(nums,left,i-1)
sortArray(nums,i+1,right)
}
运行结果:
func main() {
a := []int{4,3,2,5,7,9,12,42,5,6,3,2,1,5}
sortArray(a,0,len(a)-1)
fmt.Println(a)
}
//结果
[1 2 2 3 3 4 5 5 5 6 7 9 12 42]