package main
//堆排
func MySort( arr []int) []int {
heapSort(arr)
return arr
}
func heapSort(nums []int ) []int {
end := len(nums) -1
for i := end /2; i >= 0; i-- {
sink(nums, i, end)
}
for i := end; i >= 0; i-- {
nums[i], nums[0] = nums[0], nums[i]
end--
sink(nums, 0, end)
}
return nums
}
func sink (heap []int, root, end int) {
for {
child := root *2 +1
if child > end {
return
}
if child < end && heap[child] < heap[child +1] {
child++
}
if heap[root] > heap[child] {
return
}
heap[root], heap[child] = heap[child], heap[root]
root = child
}
}
// //快排版本,时间nlogn,最坏n^2,空间logn,不稳定
// func MySort( arr []int) []int {
// quickSort(arr , 0, len(arr)-1)
// return arr
// }
// func quickSort(nums []int, left, right int) {
// if left > right {
// return
// }
// i, j, base := left, right, nums[left]
// for i < j {
// for nums[j] >= base && i < j {
// j--
// }
// for nums[i] <= base && i < j {
// i++
// }
// nums[i], nums[j] = nums[j], nums[i]
// }
// nums[i], nums[left] = nums[left], nums[i]
// quickSort(nums, left, i-1)
// quickSort(nums, i+1, right)
// }
// //归并排序
// func MySort( arr []int) []int {
// return MergeSort(arr)
// }
// func MergeSort( nums []int) []int {
// if len(nums) <= 1 {
// return nums
// }
// mid := len(nums) /2
// left := MergeSort(nums[ :mid])
// right := MergeSort(nums[mid: ])
// return Merge(left, right)
// }
// func Merge(left, right []int) []int {
// result := make([]int, len(left) + len(right))
// l, r, i := 0, 0, 0
// for l < len(left) && r < len(right) {
// if left[l] < right[r] {
// result[i] = left[l]
// l++
// } else {
// result[i] = right[r]
// r++
// }
// i++
// }
// copy(result[i :], left[l: ])
// copy(result[i + len(left) - l: ], right[r: ])
// return result
// }