排序

1. 插入排序

  • 直接插入排序 (内存6.3MB,用时 944ms)

插排的思想是排序的排到底i个的时候,保证前面下标是0~(i-1)的序列是有序的。

func sortArray(nums []int) []int {
    for i,v := range nums {
        if i == 0{
            continue
        }
          // 左子序列判断+挪位子
        for j := i-1 ; j>=0 ; j--{
            if v < nums[j]{
                nums[j],nums[j+1] = nums[j+1], nums[j]
            }else{
                break
            }
        }
    }
    return nums
}

时间复杂度 O(n^2) 空间复杂度O(1)

  • 折半(二分)插入排序 (内存6.3MB,用时452ms)

直接插入排序是边查边挪,折半插入排序是先用二分查找找到插入点,然后统一挪位置

比较次数降至 O(nlog2(n))

时间复杂度 O(n^2) 空间复杂度O(1)

  • 希尔排序 (内存6.3MB,用时28ms)

以步长为单位,将下表为i的与i+d的元素比较,若i元素大于i+d元素,则交换,每一趟之后再将步长缩小为一般再次进行比较。

时间复杂度 O(n^2) 空间复杂度 O(1)

2. 交换排序

  • 冒泡排序

从后往前或者两两比较交换次序,每一趟把最小的放在队首,或者将最大的队尾,每一趟之后将排序元素数减一进行多次交换 (小切片代码还行,大的直接超出时间限制)

时间复杂度 O(n^2) 空间复杂度O(1)

  • 快速排序

先找个枢纽元素,默认为下标为0的元素,然后数组头尾设置标记点和枢纽元素比,找到2个元素,前面的比枢纽大,后面的比枢纽小,就交换。每一趟下来,枢纽元素的左侧都是比枢纽元素小的,右侧都是比枢纽元素大的,当头尾标记移动到相同位置时,此位置即为枢纽的位置。然后再对左右两个子序列进行递归。

递归方法:(内存6.4MB,用时24ms)

时间复杂度 O(nlogn) 空间复杂度O(1)

3.选择排序

  • 简单选择排序 每趟一次交换 (内存6.4MB,用时1456 ms)

每一趟都和第 (i+1) 个到第 n 个比较,在和把最小的元素和i交换。

  • 堆排序 (内存6.4MB,用时28ms)

4.归并排序

  • 归并排序 (执行用时 32 ms,内存消耗 7.4 MB)

时间复杂度 O(nlogn)

空间复杂度 O(n)

Tips:

归并排序不是原地排序算法。

最后更新于