import (
"fmt"
"math/rand"
)
func SortForMerge(arr []int, left int, right int) {
for i := left; i <= right; i++ {
temp := arr[i] //备份第一个
var j int
for j = i; j > left && arr[j-1] > temp; j-- { //定位
arr[j] = arr[j-1] //数据往后移动
}
arr[j] = temp //插入
}
}
func swap(arr []int, i int, j int) {
arr[i], arr[j] = arr[j], arr[i]
}
func QuickSortX(arr []int, left int, right int) {
if right-left < 2 { //数组剩下三个数,直接插入排序
SortForMerge(arr, left, right)
} else {
//随机找一个数字,放在第一个位置
swap(arr, left, rand.Int()%(right-left+1)+left)
vdata := arr[left] //坐标数据,比我小,左边;比我大,右边
lt := left // arr[left+1,lt] < vdata
gt := right + 1 //arr[gt,right] > vdata
i := left + 1 // arr[lt+1.....i]==vata
for i < gt {
if arr[i] < vdata { //移到到小于的地方
swap(arr, i, lt+1)
lt++ //前进循环
i++
} else if arr[i] > vdata {
swap(arr, i, gt-1) //移动到大于的地方
gt--
} else {
i++
}
}
swap(arr, left, lt)
QuickSortX(arr, left, lt-1)
QuickSortX(arr, gt, right)
}
}
//节约内存,直接操作数据,不需要返回,快速排序核心程序
func QuicksortPlus(arr []int) {
QuickSortX(arr, 0, len(arr)-1)
}
//用法
QuicksortPlus(arr)
网友评论