既想学习go语言,又想复习算法。emmmm,一拍即合,用go写点代码(算法)。
本文参考(https://blog.csdn.net/qq_36528114/article/details/78667034)
一、前后指针实现方式
假定传入的是数据序列,使用left和right作为前后下标变量(也可视为指针)。那么一般而言,每次会记录数据第一个的数据或者最后一个数据作为标记flg;有个规律:如果选择第一个数据作为flg,那么先从数组最后一个数开始查找小于flg的数据,当left==right的情况,right选中的总是小于flg的数,直接与flg交换即可。若选择最后一个数据作为flg,那么要先从0下标开始查找大于flg的数据,当left=right时,left选择的数比大于flg,最后与flg交换,必须满足是大于flg的数。
思想:一趟排序,令flg左边的数都小于flg,右边的数都大于flg
一趟过程:使用两个下标变量(指针)分别从两端开始遍历数组,left找到大于flg的数,right找到小于flg的数,两者交换,使得left遍历过的数都是小于flg,right遍历过的数都是大于flg。
代码:
package main
import "fmt"
func sorting(alist []int,start1 int,end1 int) int{
var flg int=alist[start1]
left:=start1
right:=end1
for ;left<right;{
for ;left<right && alist[right]>=flg;{
right-=1
}
for ;left<right && alist[left]<=flg;{
left+=1
}
if(left!=right){
tmp:=alist[right]
alist[right]=alist[left]
alist[left]=tmp
fmt.Println(alist)
}
}
tmp:=alist[start1]
alist[start1]=alist[right]
alist[right]=tmp
fmt.Println(alist)
return right
}
func quicks(alist []int,start int,end int){
if(start>=end) {return}
indx:=sorting(alist,start,end)
quicks(alist,start,indx-1)
quicks(alist,indx+1,end)
}
func main(){
var alis = []int{6,4,7,9,3,11,1,5,8,10}
var start int =0
var end int = len(alis)-1
fmt.Println(alis)
quicks(alis,start,end)
fmt.Println(alis)
}
结果:
[6 4 7 9 3 11 1 5 8 10]
[6 4 5 9 3 11 1 7 8 10]
[6 4 5 1 3 11 9 7 8 10]
[3 4 5 1 6 11 9 7 8 10]
[3 1 5 4 6 11 9 7 8 10]
[1 3 5 4 6 11 9 7 8 10]
[1 3 4 5 6 11 9 7 8 10]
[1 3 4 5 6 10 9 7 8 11]
[1 3 4 5 6 8 9 7 10 11]
[1 3 4 5 6 8 7 9 10 11]
[1 3 4 5 6 7 8 9 10 11]
[1 3 4 5 6 7 8 9 10 11]
二、挖坑交换
待续...