785. 快速排序(Go)
注意:唯一一个坑点 当数据全部为顺序时会T掉,因为每次j指针需要遍历到最前。因此选择中间元素会使得两侧递归运行时间均匀,不会导致一侧的递归等待另一侧递归完成
package main
import (
"fmt"
)
func main() {
var n int
fmt.Scanf("%d", &n)
// 开辟指定空间
q := make([]int, n)
for i := 0; i < n; i++ {
fmt.Scanf("%d", &q[i])
}
quickSort(q, 0, n-1)
//输出
for i := 0; i < n; i++ {
fmt.Printf("%d ", q[i])
}
//fmt.Println()
}
func quickSort(q []int, l int, r int) {
// 局部有序
if l >= r {
return
}
// 基准值
//x := q[l]
x := q[l+(r-l)/2] // 确定分界点
i, j := l-1, r+1
for i < j {
for {
i++
if !(q[i] < x) {
break
}
}
for {
j--
if !(q[j] > x) {
break
}
}
/* 指针没撞上则交换 */
if i < j {
q[i], q[j] = q[j], q[i]
}
}
quickSort(q, l, j)
quickSort(q, j+1, r)
}

浙公网安备 33010602011771号