快速排序的递归写法
func Quicksort(arr []int, i, j int) {
if i >= j {
return
}
m := partion(arr, i, j)
Quicksort(arr, i, m-1)
Quicksort(arr, m+1, j)
}
// 把s,e分为两段,并返回分割点idx
func partion(arr []int, s, e int) int {
prefix := arr[s]
idx := s + 1
for i := idx; i <= e; i++ {
if arr[i] < prefix {
arr[i], arr[idx] = arr[idx], arr[i]
idx++
}
}
idx--
arr[s], arr[idx] = arr[idx], arr[s]
return idx
}
快速排序的非递归写法
核心就是把之前的递归调用改成了i,j的入栈操作
// 非递归快排
func QuicksortNOR(arr []int, i, j int) {
if i >= j {
return
}
// 通过一个栈,将符合条件的区间下标放进来,模拟递归调用
stack := []int{i, j}
for len(stack) > 1 {
l := len(stack)
s := stack[l-2]
e := stack[l-1]
stack = stack[:l-2]
m := partion(arr, s, e)
if s < m-1 {
stack = append(stack, s, m-1)
}
if e > m+1 {
stack = append(stack, m+1, e)
}
}
}
// 把s,e分为两段,并返回分割点idx
func partion(arr []int, s, e int) int {
prefix := arr[s]
idx := s + 1
for i := idx; i <= e; i++ {
if arr[i] < prefix {
arr[i], arr[idx] = arr[idx], arr[i]
idx++
}
}
idx--
arr[s], arr[idx] = arr[idx], arr[s]
return idx
}