美文网首页
基础排序:插入排序

基础排序:插入排序

作者: AugustWu | 来源:发表于2017-02-21 15:07 被阅读0次

    一、什么是插入排序?

    其实插入排序是十分简单的排序方法,类似于我们打扑克,每次抽牌之后插入到原有的牌中,让他们始终保持有序。

    二、为什么要讲插入排序?

    插入排序是一种时间复杂度为O(n2)的排序算法,排序100万个整数就需要几乎一个小时。我写这篇博客的原因主要是看了《编程珠玑》讲解插入排序时,我作为一个新人,并没有注意到的一些点。

    三、正文

    首先我们先用最简单的方法实现插入排序,同样是用我最近正在学习的Go语言实现。

    func InsertSort(arr []int) {
        for i := 1; i < len(arr); i++ {  // 外循环
            for (j = i; j > 0 && arr[j] < arr[j-1]; j--) {  // 内循环
                arr[j], arr[j-1] = arr[j-1], arr[j]
            }
        }
    }
    

    然而一些语言的语法糖或者语言自带库函数有时候用起来会简便,例如一些语言库函数中有swap()函数用于交换,但是性能上未必是最好的。

    arr[j], arr[j-1] = arr[j-1], arr[j]
    

    上面的Go语言语句实际表现为:

    tmp := arr[j]
    arr[j] = arr[j-1]
    arr[j-1] = tmp
    

    我们发现,每次内循环都会对tmp赋相同的初始值arr[i],所以我们将tmp赋值语句移出内循环,变为

    func InsertSort(arr []int) {
        for i := 1; i < len(arr); i++ {  // 外循环
            tmp := arr[i]
            for (j = i; j > 0 && tmp < arr[j-1]; j--) {  // 内循环
                arr[j] = arr[j-1]
            }
            x[j] = tmp
        }
    }
    

    修改后的代码在机器上运行要比修改前快10%左右,提升虽然不大,但是在编码中是我这种新人应该关注的点。

    (如有错误,欢迎指正)

    相关文章

      网友评论

          本文标题:基础排序:插入排序

          本文链接:https://www.haomeiwen.com/subject/iqruwttx.html