直接插入排序

247 阅读1分钟

直接插入排序,时间复杂度O(n2n^2),空间复杂度O(1)。就地排序。稳定排序。

基本实现代码如下(已在leetcode提交通过)。题目链接

func sortArray(nums []int) []int {
    l := len(nums)
    if l < 2 {
        return nums
    }
    for i := 1; i < l; i++ {
        n := nums[i]
        j := i-1
        for j >= 0 && nums[j] > n {
            nums[j+1] = nums[j]
            j--
        }
        nums[j+1] = n
    }
    return nums
}

用copy做简单优化后的代码如下(已在leetcode提交通过)。题目同上。

func sortArray(nums []int) []int {
    l := len(nums)
    if l < 2 {
        return nums
    }
    for i := 1; i < l; i++ {
        n := nums[i]
        j := i-1
        for j >= 0 && nums[j] > n {
            j--
        }
        k := j+1
        if k < i {
            c := i-k
            switch c {
            case 2:
                nums[k+2] = nums[k+1]
                fallthrough
            case 1:
                nums[k+1] = nums[k]
            default:
                copy(nums[k+1:], nums[k:i])
            }
            nums[k] = n
        }
    }
    return nums
}