Skip to main content

快速排序

基于分制的思想

func quicksort(list []int, left, right int) {
if left >= right {
return
}
pivot := partition(list, left, right)
fmt.Println(pivot)
quicksort(list, left, pivot-1)
quicksort(list, pivot+1, right)
}

// 基于pivot进行分制


func partition2(arr []int, low, high int) int {
pivot := arr[high]
counter := low
for j := low; j < high; j++ {
if arr[j] < pivot {
arr[counter], arr[j] = arr[j], arr[counter] //比基点小的放前边
counter++
}
}
arr[counter], arr[high] = arr[high], arr[counter] //将基点放到合适的位置
return counter
}

// 分成两类数 一组比基点小 另一组比基点大
//

func partition(arr []int, low, high int) int {
pivot := arr[low] // 基准点选择最左边的元素
i := low
j := high
for i < j {
for i < j && arr[j] > pivot {
j--
}
for i < j && arr[i] <= pivot { //= 号位置不能乱写 前置条件不能省略 i < j
i++
}

arr[i], arr[j] = arr[j], arr[i] // 左右指针相互交换

}
fmt.Println("i", i, "j", j)
arr[low], arr[i] = arr[i], arr[low] //基点放到合适的位置
return i
}


//测试
func main() {
list := make([]int, 0)
list = append(list, 5, 2, 8, 2, 9, 5, 1, 7)
fmt.Println(list)
quicksort(list, 0, len(list)-1)
fmt.Println(list)
}
// 简单 但是浪费空间
func quickSort2(arr []int) []int {
if len(arr) <= 1 {
return arr
}

pivot := arr[0]
var left, right []int

for _, v := range arr[1:] {
if v <= pivot {
left = append(left, v)
} else {
right = append(right, v)
}
}

left = quickSort2(left)
right = quickSort2(right)

return append(append(left, pivot), right...)
}