func QuickSortV2(arr []int) {
sort(arr, 0, len(arr)-1)
}
func sort(arr []int, left int, right int) {
if left >= right {
return
}
p := paration(arr, left, right)
sort(arr, left, p-1)
sort(arr, p+1, right)
}
func paration(arr []int, left int, right int) int {
// 在 left和right之间生成一个随机索引
//seed := time.Now().UnixNano() // seed函数耗时太长,目前没有找到更好的方法
//rand.Seed(seed)
//p := rand.Intn(right-left) + left + 1
//swap(arr, left, p)
p := rand.Int()%(right-left+1) + left
arr[p], arr[right] = arr[right], arr[p]
swap(arr, left, p)
// left+1到j直接都是小于v的,j+1到i-1直接都是大于v的
j := left
for i := left; i <= right; i++ {
if arr[i] < arr[left] {
j++
swap(arr, i, j)
}
}
swap(arr, left, j)
return j
}
func swap(arr []int, i int, j int) {
tmp := arr[i]
arr[i] = arr[j]
arr[j] = tmp
}
如果使用这个随机调换数组中元素位置的方式,耗时5秒多
// 在 left和right之间生成一个随机索引
//seed := time.Now().UnixNano() // seed函数耗时太长,目前没有找到更好的方法
//rand.Seed(seed)
//p := rand.Intn(right-left) + left + 1
//swap(arr, left, p)
如果使用这个随机调换数组中元素位置的方式,耗时3秒多
p := rand.Int()%(right-left+1) + left
arr[p], arr[right] = arr[right], arr[p]
swap(arr, left, p)
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星