912. 排序数组
Link
Problem
给你一个整数数组 nums
,请你将该数组升序排列。
示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]
示例2:
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
提示:
1 <= nums.length <= 5 * 104
-5 * 104 <= nums[i] <= 5 * 104
Solution
快速排序
func sortArray(nums []int) []int {
rand.Seed(time.Now().Unix())
qsort(nums, 0, len(nums)-1)
return nums
}
func qsort(nums []int, l, r int){
if l >= r {
return
}
index := randomPartition(nums, l, r)
qsort(nums, l, index-1)
qsort(nums, index+1, r)
}
func randomPartition(nums []int, l, r int) int {
i := rand.Intn(r-l+1)+l
nums[i], nums[r] = nums[r], nums[i]
return partition(nums, l, r)
}
func partition(nums []int, l, r int) int {
x := nums[r]
index := l
for i := l; i < r; i++ {
if nums[i] < x {
nums[index], nums[i] = nums[i], nums[index]
index++
}
}
nums[index], nums[r] = nums[r], nums[index]
return index
}
归并排序
func sortArray(nums []int) []int {
mergeSort(nums, 0, len(nums)-1)
return nums
}
func mergeSort(nums []int, l, r int) {
if l>=r {
return
}
mid := l + (r-l)>>1
mergeSort(nums, l, mid)
mergeSort(nums, mid+1, r)
//剪枝
if nums[mid+1] > nums[mid] {
return
}
//归并
i, j := l, mid+1
tmp := make([]int, r-l+1)
for pos := range tmp {
if j>r || (i<=mid && nums[i] < nums[j]) {
tmp[pos] = nums[i]
i++
}else{
tmp[pos] = nums[j]
j++
}
}
copy(nums[l:r+1], tmp)
}
堆排序
func sortArray(nums []int) []int {
heapsort(nums)
return nums
}
func heapsort(nums []int){
end := len(nums) - 1
for i:=end>>1; i>=0; i--{
sink(nums, i, end)
}
for i:=end; i>=0; i--{
nums[0], nums[i] = nums[i], nums[0]
end--
sink(nums, 0, end)
}
}
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
}
}
最后更新于
这有帮助吗?