基础排序:插入排序

一、什么是插入排序?

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

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

插入排序是一种时间复杂度为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%左右,提升虽然不大,但是在编码中是我这种新人应该关注的点。

(如有错误,欢迎指正)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,751评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,796评论 0 7
  • 276期,感谢1组成员 【日精进打卡第74天】 【知~学习】 《六项精进》读0遍 共77遍 《六项精进》背0遍 共...
    周晨i阅读 165评论 0 0
  • 6/26 感恩早上我起不来,良彦起来做早饭。感恩,今天早上提出水池破漏,他中午就买了玻璃胶自己打。感恩,晚上良彦回...
    晓晶_5fde阅读 426评论 0 2