func sortArray(nums []int) []int {
quickSort(nums)
return nums
}
func quickSort(nums []int) {
left, right := 0, len(nums) - 1
for right > left {
// 右边部分放大于
if nums[right] > nums[0] {
right--
continue
}
// 左边部分放小于等于
if nums[left] <= nums[0] {
left++
continue
}
nums[left], nums[right] = nums[right], nums[left]
}
nums[0], nums[right] = nums[right], nums[0]
if len(nums[:right]) > 1 {
sortArray(nums[:right])
}
if len(nums[right + 1:]) > 1 {
sortArray(nums[right + 1:])
}
}
时间复杂度 O(nlogn) 空间复杂度O(1)
3.选择排序
简单选择排序 每趟一次交换 (内存6.4MB,用时1456 ms)
每一趟都和第 (i+1) 个到第 n 个比较,在和把最小的元素和i交换。
func sortArray(nums []int) []int {
var (
lens = len(nums)
index int
min int
)
for i,v := range nums{
index = i
min = v
for 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)
func sortArray(nums []int) []int {
// 先构建最大堆
for i:= len(nums)/2; i >=0; i--{
MaxHead(nums,i)
}
var end = len(nums)-1
for end > 0 {
// 每次把堆顶元素(切片下标1)和最后一个叶子节点互换
nums[0],nums[end] = nums[end],nums[0]
// 把最后一个叶子节点(上次排序的最大值)扣去,重新排序
MaxHead(nums[:end],0)
end--
}
return nums
}
func MaxHead(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)
// 分治
func sortArray(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
}
return Merge(sortArray(nums[:lens/2]),sortArray(nums[lens/2:]))
}
// 合并
func Merge(Pre,Post []int) []int{
var lenPre,lenPost = len(Pre),len(Post)
var list []int
var 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
}