785. 快速排序(Go)

785. 快速排序 - AcWing题库

 

注意:唯一一个坑点 当数据全部为顺序时会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)
}

posted @ 2025-12-23 23:24  BlackSnow  阅读(4)  评论(0)    收藏  举报