归并排序
func mergeSort(nums []int) []int {
n := len(nums)
if n <= 1 {
return nums // 注意判断退出条件
}
mid := n / 2
left := mergeSort(nums[:mid])
right := mergeSort(nums[mid:]) // 注意这里的条件,不是mid+1
return merge(left, right)
}
func merge(left []int, right []int) []int {
n := len(left)
m := len(right)
nums := make([]int, 0, n+m)
i, j := 0, 0
for i < n || j < m {
if i == n {
nums = append(nums, right[j])
j++
} else if j == m {
nums = append(nums, left[i])
i++
} else if left[i] < right[j] {
nums = append(nums, left[i])
i++
} else {
// left[i]>=right[j]
nums = append(nums, right[j])
j++
}
}
return nums
}
func main() {
nums := []int{2, 5, 7, 2, 3, 4, 1, 9, 2}
fmt.Println(mergeSort(nums))
nums = []int{2, 5, 7, 2, 3, 4, 1, 9, 2, 15}
fmt.Println(mergeSort(nums))
nums = []int{0, 2, 5, 7, 2, 3, 4, 1, 9, 2}
fmt.Println(mergeSort(nums))
nums = []int{0, 2, 5, 7, 2, 3, 4, 1, 9, 2, 15}
fmt.Println(mergeSort(nums))
nums = []int{0, 1, 2, 3}
fmt.Println(mergeSort(nums))
}
快速排序
func quickSort(nums []int, low int, high int) {
if low >= high {
return
}
value := nums[low] // 基准值,期望在它左边的都小于等于它,在它右边的都大于等于它
i, j := low, high
for i < j {
for i < j && nums[j] > value {
j--
}
nums[i], nums[j] = nums[j], nums[i]
for i < j && nums[i] <= value {
i++
}
nums[i], nums[j] = nums[j], nums[i]
}
quickSort(nums, low, i-1)
quickSort(nums, i+1, high)
}
func main() {
nums := []int{2, 5, 7, 2, 3, 4, 1, 9, 2}
quickSort(nums, 0, len(nums)-1)
fmt.Println(nums)
nums = []int{2, 5, 7, 2, 3, 4, 1, 9, 2, 15}
quickSort(nums, 0, len(nums)-1)
fmt.Println(nums)
nums = []int{0, 2, 5, 7, 2, 3, 4, 1, 9, 2}
quickSort(nums, 0, len(nums)-1)
fmt.Println(nums)
nums = []int{0, 2, 5, 7, 2, 3, 4, 1, 9, 2, 15}
quickSort(nums, 0, len(nums)-1)
fmt.Println(nums)
nums = []int{0, 1, 2, 3}
quickSort(nums, 0, len(nums)-1)
fmt.Println(nums)
}