快排 - golang

既想学习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]

二、挖坑交换

待续...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值