波波老师,关于三路快排的partition这里,我按照你的动画讲解,自己补充了一下思路:
然后自己按照思路用go写了如下代码:
func partition(nums []int, l, r int) (int, int) {
random := rand.Int()%(r-l+1) + l
nums[l], nums[random] = nums[random], nums[l]
v := nums[l]
lt, gt := l+1, r
for i := l + 1; i <= r; i++ {
if i >= gt {
break
} else if nums[i] < v {
nums[i], nums[lt+1] = nums[lt+1], nums[i]
lt++
} else if nums[i] > v {
nums[i], nums[gt-1] = nums[gt-1], nums[i]
gt--
}
}
nums[l], nums[lt] = nums[lt], nums[l]
return lt, gt
}
通过测试发现我的代码也是可以正常排序的。
比较了老师的代码实现后,这里我就产生了一些小小的疑惑:
lt = l+1
,gt = r
,跟老师的有些差异。老师这里讲解是为了确保三个区域初始化时都为空。那么我这样设置是否合理呢?nums[i]>v
时,不需要操作i++
,因为换位后i依然是一个未被处理的元素。但是我的代码中,即使nums[i]>v
时i也是从前往后一直循环遍历的。这里是不是跟老师的代码有出入呢?刚刚开始学习算法和数据结构,发现有些地方不是很清楚,麻烦老师帮解惑一下,谢谢老师!