funcsortArray(nums []int) []int {var ( lens =len(nums) index int min int )for i,v :=range nums{ index = i min = vfor j:=i+1; j<lens; j++ {if nums[j] < min { index = j min = nums[j] } }if index != i { nums[i],nums[index] = nums[index],nums[i] } }return nums}
堆排序 (内存6.4MB,用时28ms)
funcsortArray(nums []int) []int {// 先构建最大堆for i:=len(nums)/2; i >=0; i--{MaxHead(nums,i) }var end =len(nums)-1for end >0 {// 每次把堆顶元素(切片下标1)和最后一个叶子节点互换 nums[0],nums[end] = nums[end],nums[0]// 把最后一个叶子节点(上次排序的最大值)扣去,重新排序 MaxHead(nums[:end],0) end-- }return nums}funcMaxHead(nums []int,pos int){var ( lens =len(nums) -1 left = pos *2+1 right = left +1 step = left )if left > lens{return }// 右节点存在的处理if right <= lens {if nums[right] > nums[left]{ step = right } }// 子节点大就交换if nums[pos] < nums[step]{ nums[pos],nums[step] = nums[step],nums[pos]// 递归子节点MaxHead(nums,step) }return}
4.归并排序
归并排序 (执行用时 32 ms,内存消耗 7.4 MB)
// 分治funcsortArray(nums []int) []int {var lens =len(nums)// 拆出来可能是单个的处理下if lens <=1{return nums }// 比较+交换if lens ==2{if nums[0] > nums[1]{ nums[1],nums[0] = nums[0],nums[1] }return nums }returnMerge(sortArray(nums[:lens/2]),sortArray(nums[lens/2:]))}// 合并funcMerge(Pre,Post []int) []int{var lenPre,lenPost =len(Pre),len(Post)var list []intvar i,j int// 比较+合并for i < lenPre && j < lenPost{if Pre[i] <= Post[j]{ list =append(list,Pre[i]) i++ }else{ list =append(list,Post[j]) j++ } }// 多出来数的直接接到后面if i < lenPre{ list =append(list,Pre[i:]...) }if j < lenPost{ list =append(list,Post[j:]...) }return list}