插入排序、希尔排序

362 阅读1分钟

插入排序:从一个无序队列中抽取一个数插入到已经排好序的队列中,要求被插入的队列依然保持有序

时间复杂度 : O(n^2)

稳定性 :稳定

代码实现

func inserSort(arr []int) []int{
    l := len(arr)
    for i:=0;i<l;i++{
        data := arr[i] // 被抽取的数
        j := i-1 // 从尾到头遍历
        for ;j>=0;j--{
            if arr[j]>data{
                arr[j+1] = arr[j] // 往后移动元素
            }else{ // 已经排好序,不需要再继续执行
                break
            }
        }
        arr[j+1] = data // 插入数据
    }
    return arr
}

希尔排序(插入排序优化):在插入排序的基础上进行添加分段处理,添加一个步长比较,使每次做插入排序的数组尽可能有序,这样break的情况就会增加,就可以减少数组移动

时间复杂度 : O(n^2)或者说不确定,但一般比插入排序较优

稳定性 :不稳定

代码实现

func helSort(arr []int) []int{
    l := len(arr)
    for step := l/2;step >0;step /=2{ // 增量
        //以下全部是插入排序的实现,唯一区别在于插入排序增量为1,而希尔排序增量为step
        for i:=step;i<l;i += step{
            data := arr[i]
            j := i - step
            for ;j>=0;j-=step{
                if arr[j]>data{
                    arr[j+step]=arr[j]
                }else{
                    break
                }
            }
            arr[j+step]=data
        }
    }
    return arr
}

总结

插入排序和希尔排序很相似,唯一区别在于希尔排序添加分段思想,尽可能将分段排好序之后再做插入排序,
使数组移动的元素不那么频繁,实现优化,但是希尔排序不稳定,需要谨慎使用