快速排序 前奏
Partition 过程
给定一个数组arr,和一个整数num。请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。不需要有序
要求:额外空间复杂度O(1),时间复杂度O(N)
\
<= 区域 | [ 5 3 7 2 3 4 1 ] num = 3
/ 下标 0 1 2 3 4 5 6
1. arr[i] <= num 当前数和 <=区下一个数交换, <= 区右扩,i++
2. arr[i] > num i++ 直接跳下一个
func TestP(t *testing.T) {
arr := []int{12, 321, 2, 901, 0, 23, 344, 2, 1, -100, -200, -32, 4, 3, 5, 6, 9}
arr = []int{ 5, 3, 7, 2, 3, 4, 1}
fmt.Println(p(arr,3 ))
fmt.Println(arr)
}
func p(arr []int, num int) int {
leIndex := -1
for i := 0; i < len(arr); i++ {
if arr[i] <= num {
leIndex++
if leIndex == i {
continue
}
arr[i] ^= arr[leIndex]
arr[leIndex] ^= arr[i]
arr[i] ^= arr[leIndex]
}
}
return leIndex
}