快速排序
递归过程:
- 将数组分为比基准值两部分,左边比基准值小,右边比基准值大
- 将左边进行操作1
- 将右边进行操作1
- 直到 left < rignt ,返回arr
操作1的过程:
pivot := left
index := pivot+1
- 将left作为基准(如果找其他作为基准,可以将值与left交换,下面步骤一样)。
- 扫描从left的下一个位置开始(其实就是把第一轮循环,给跳过去了,也可以不跳,不影响结果)
- index永远指向已经扫描过的数组中比基准小的那一部分的最右位置的下一个位置(或者说是最大部分的最左位置)。(初始位置则是已经扫描过的数组个数是0,所以指向第一个数据)
- 扫描结束后将最右部分的最右数据(也就是index-1)与基准交换,
func quickSort(arr []int) []int {
return _quickSort(arr, 0, len(arr)-1)
}
func _quickSort(arr []int, left, right int) []int {
if left < right {
partitionIndex := partition(arr, left, right)
_quickSort(arr, left, partitionIndex-1)
_quickSort(arr, partitionIndex+1, right)
}
return arr
}
func partition(arr []int, left, right int) int {
pivot := left
index := pivot + 1
for i := index; i <= right; i++ {
if arr[i] < arr[pivot] {
swap(arr, i, index)
index += 1
}
}
swap(arr, pivot, index-1)
return index - 1
}
func swap(arr []int, i, j int) {
arr[i], arr[j] = arr[j], arr[i]
}
import "sort"
func sortArray(nums []int) []int {
sort.Ints(nums)
return nums
}