快速排序
双路归并快排
package main
import (
"fmt"
)
func main() {
arr := []int{12, 4, 5, 6, 7, 3, 1, 15}
fmt.Println("原始数组:", arr)
mergeSort(arr)
fmt.Println("排序后数组:", arr)
}
// mergeSort 使用双路归并快速排序算法对切片进行排序
func mergeSort(arr []int) {
// 创建一个临时数组用于归并过程
tmp := make([]int, len(arr))
sort(arr, tmp, 0, len(arr)-1)
}
// sort 是递归调用的归并排序函数
func sort(arr, tmp []int, left, right int) {
if left < right {
// 计算中间位置
mid := (left + right) / 2
// 对左半部分进行递归排序
sort(arr, tmp, left, mid)
// 对右半部分进行递归排序
sort(arr, tmp, mid+1, right)
// 合并左右两部分
merge(arr, tmp, left, mid, right)
}
}
// merge 用于归并两个有序的部分
func merge(arr, tmp []int, left, mid, right int) {
i := left // 左半部分的起始位置
j := mid + 1 // 右半部分的起始位置
k := left // 归并后的位置
// 归并过程,将两部分按顺序合并到临时数组 tmp 中
for i <= mid && j <= right {
if arr[i] <= arr[j] {
tmp[k] = arr[i]
i++
} else {
tmp[k] = arr[j]
j++
}
k++
}
// 处理剩余的元素,可能存在左半部分或右半部分有剩余的情况
for i <= mid {
tmp[k] = arr[i]
i++
k++
}
for j <= right {
tmp[k] = arr[j]
j++
k++
}
// 将归并后的结果复制回原数组 arr
for i := left; i <= right; i++ {
arr[i] = tmp[i]
}
}