func heap_sort(nums []int) []int { lens := len(nums) - 1 // 建堆 O(n) lens/2后面都是叶子节点,不需要向下调整 for i := lens/2; i >= 0; i -- { down(nums, i, lens) } for j := lens; j >= 1; j -- { // 将最大值放到后面 nums[0], nums[j] = nums[j], nums[0] // 最后一位已经是最大值,调整之前的值 lens -- down(nums, 0, lens) } return nums } //O(logn)大根堆,如果堆顶节点小于叶子,向下调整 func down(nums []int, i, lens int) { // 当前值是最大值 max := i // 如果他的左节点大于最大值 if i<<1+1 <= lens && nums[i<<1+1] > nums[max] { // 则最大值等于子节点 max = i<<1+1 } // 如果他的右节点大于最大值 if i<<1+2 <= lens && nums[i<<1+2] > nums[max] { max = i<<1 + 2 } // 如果最大值发生变化,则交换两个位置 if max != i { nums[max], nums[i] = nums[i], nums[max] // 递归向下调整 down(nums, max, lens) } }
时间: O(nlogn) 空间:O(1) 不稳定
选择排序
当前循环的值为最小值,内层循环遍历后面的,后面的小于最小值,找到一个最小的,最后交换位置
1 2 3 4 5 6 7 8 9 10 11
func select_sort(q []int) { for i := 0; i < len(q) - 1; i++ { minIndex := i for j := i;j < len(q); j++ { if q[j] < q[minIndex] { minIndex = j } } q[i], q[minIndex] = q[minIndex], q[i] } }
时间复杂度:O(n ^2) 空间复杂度:O(1) 不稳定
冒泡排序
两两交换,保证最后一个是最大值,然后第二次遍历就到最后一个的前面截止
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
func bubbleSort(q []int) { n := len(q) for i := 0; i < n - 1; i++ { exchange := false for j := 0; j < n-1-i; j++ { if q[j] > q[j+1] { q[j], q[j+1] = q[j+1], q[j] exchange = true } } if !exchange { break } }
}
时间复杂度:O(n ^2) 空间复杂度:O(1) 稳定
插入排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
func insertSort(nums []int) []int { n := len(nums) for i := 1; i < n; i++ { tmp := nums[i] j := i - 1 //左边比右边大 for j >= 0 && nums[j] > tmp { //右边的数就等于前一个数,最后大于tmp的都被j+1赋值,相当于右移 nums[j+1] = nums[j] j-- //到前一个数 } // 上一步比tmp大的 都右移过去之后,小于tmp的右边 nums[j+1] = tmp } return nums }
时间复杂度:O(n ^2) 空间复杂度:O(1) 稳定
希尔排序
插入排序的优化,长度/2,再次/4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
func shell_sort(q []int) { // 先排n/2,后面的排好,再排n/4 for k := len(q) / 2; k > 0; k /= 2 { // 从k开始往后,插入排序 for i := k; i < len(q); i++ { tmp := q[i] j := i - k for j >= 0 && tmp < q[j] { q[j+k] = q[j] j -= k } q[j+k] = tmp } } }
时间复杂度: O(nlogn) 空间复杂度: O(1) 不稳定
计数排序
找出最大值即可,然后从1到最大值生成map,有值记为1,没有的记为0
然后继续0到最大值,遍历,从字典取值,就是按顺序取的,按顺序放到数组里
1 2 3 4 5 6 7 8 9 10 11 12 13 14
func qSort(q []int) { v := [10001]int{} for i := 0; i < len(q); i++{ v[5000+q[i]]++ } idx := 0 for i := 0; i < 10001; i++ { for v[i] > 0 { q[idx] = i - 5000 idx++ v[i]-- } } }