785. 快速排序
package main
import "fmt"
func main() {
var n int
fmt.Scanf("%d", &n)
nums := make([]int, n)
for i:=0;i<n;i++{
fmt.Scanf("%d", &nums[i])
}
quickSort(nums, 0, n-1)
for i:=0;i<n;i++{
fmt.Printf("%d ", nums[i] )
}
}
func quickSort(nums []int ,left, right int ) {
if left >= right { // 终止条件
return
}
mid := nums[left + (right-left)/2] // 注意这里要是一个确定值,而是一个下标。
i, j := left-1, right+1 // 两个指针,因为do while要先自增/自减
for i < j { // 每次迭代
for { // do while 语法
i++ // 交换后指针要移动,避免没必要的交换
if nums[i] >= mid {
break
}
}
for {
j--
if nums[j] <= mid {
break
}
}
if i < j { // swap 两个元素
nums[i], nums[j] = nums[j], nums[i]
}
}
// 递归处理左右两段
quickSort(nums, left, j)
quickSort(nums, j+1, right)
}
模板背诵
// 快速排序模板,不要背诵字母,要背诵思路和基本代码表达
func quickSort(nums []int, l, r int) {
if l >= r { // 终止条件
return
}
x := nums[l+(r-l)/2] // 确定分界点,这里要是一个值,而不是下标。
i, j := l-1, r+1 // 两个指针,因为do while要先自增/自减
for i < j { // 每次迭代
for { // do while 语法
i++ // 交换后指针要移动,避免没必要的交换
if nums[i] >= x {
break
}
}
for {
j--
if nums[j] <= x {
break
}
}
if i < j { // swap 两个元素
nums[i], nums[j] = nums[j], nums[i]
}
}
quickSort(nums, l, j) // 递归处理左右两段
quickSort(nums, j+1, r)
}