jspackage main
import "fmt"
func quickSort(nums []int, left, right int) {
if left >= right {
return
}
pivot := nums[left] // 选最左作为基准
i, j := left, right
for i < j {
// 从右往左找小于 pivot 的
for i < j && nums[j] >= pivot {
j--
}
// 从左往右找大于 pivot 的
for i < j && nums[i] <= pivot {
i++
}
nums[i], nums[j] = nums[j], nums[i]
}
// 把 pivot 放到正确位置
nums[left], nums[i] = nums[i], nums[left]
quickSort(nums, left, i-1)
quickSort(nums, i+1, right)
}
func main() {
arr := []int{5, 2, 3, 1, 4}
quickSort(arr, 0, len(arr)-1)
fmt.Println(arr)
}
jspackage main
import "fmt"
func quickSort(arr []int, left, right int) {
if left < right {
// 获取分区后的基准索引
pivotIndex := partition(arr, left, right)
// 递归排序左半部分
quickSort(arr, left, pivotIndex-1)
// 递归排序右半部分
quickSort(arr, pivotIndex+1, right)
}
}
func partition(arr []int, left, right int) int {
// 选择最右侧元素作为基准
pivot := arr[right]
i := left - 1 // i 指向小于基准的区域边界
for j := left; j < right; j++ {
// 如果当前元素小于或等于基准
if arr[j] <= pivot {
i++
// 交换元素
arr[i], arr[j] = arr[j], arr[i]
}
}
// 将基准值交换到中间正确的位置
arr[i+1], arr[right] = arr[right], arr[i+1]
return i + 1
}
func main() {
data := []int{34, 7, 23, 32, 5, 62}
fmt.Println("排序前:", data)
quickSort(data, 0, len(data)-1)
fmt.Println("排序后:", data)
}
jspackage main
import (
"fmt"
"math/rand"
"time"
)
// 快速排序入口函数
func QuickSort(arr []int) {
if len(arr) <= 1 {
return // 递归终止条件:数组长度≤1时已有序
}
// 分区操作,返回基准元素的最终索引
pivotIdx := partition(arr)
// 递归排序左右子数组
QuickSort(arr[:pivotIdx])
QuickSort(arr[pivotIdx+1:])
}
// 分区函数:将数组分为左右两部分,返回基准元素的索引
func partition(arr []int) int {
// 选择最后一个元素作为基准
pivot := arr[len(arr)-1]
i := 0 // i是小于基准的区域的最后一个元素的索引
// 遍历数组(除基准元素外)
for j := 0; j < len(arr)-1; j++ {
if arr[j] <= pivot {
// 将当前元素交换到小于基准的区域
arr[i], arr[j] = arr[j], arr[i]
i++
}
}
// 将基准元素放到正确的位置(小于基准区域的下一个位置)
arr[i], arr[len(arr)-1] = arr[len(arr)-1], arr[i]
return i
}
func main() {
// 初始化随机数生成器
rand.Seed(time.Now().UnixNano())
// 生成随机测试数组
arr := make([]int, 10)
for i := range arr {
arr[i] = rand.Intn(100)
}
fmt.Println("排序前:", arr)
QuickSort(arr)
fmt.Println("排序后:", arr)
}
js// 优化的分区函数:随机选择基准
func partitionOptimized(arr []int) int {
// 随机选择一个索引作为基准
randIdx := rand.Intn(len(arr))
// 将基准元素交换到数组末尾,复用原分区逻辑
arr[randIdx], arr[len(arr)-1] = arr[len(arr)-1], arr[randIdx]
return partition(arr) // 调用原分区函数
}
// 优化的快速排序入口
func QuickSortOptimized(arr []int) {
if len(arr) <= 1 {
return
}
pivotIdx := partitionOptimized(arr)
QuickSortOptimized(arr[:pivotIdx])
QuickSortOptimized(arr[pivotIdx+1:])
}
本文作者:曹子昂
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!