vlambda博客
学习文章列表

算法导论学习第一天(插入排序和循环不变式)

    以前读过一段时间的算法导论,但是长时间没有用过,最后还是忘记了,2020人总要学点新东西,重新拿起这本书,利用空余时间学习算法导论,并整理一些笔记分享给大家。(强烈推荐b站麻省理工的算法导论视频)

插入排序

   插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。简单点说就是类似于打牌。按照从小到大抓一张插入一张。

  这里我们看一段伪代码:

循环不变式:

  初始化:循环的第一次迭代之前,它为真。

  保持:如果循环的某次迭代之前为真,那么下次迭代之前它仍为真。

  终止:在循环终止,不变式为我们提供一个有用的性质,该性质有助于证明算法正确的。

  简单点说,在for循环的每次迭代开始,包含元素A[1..j-1]的子数组构成了当前排序好的数组,剩余的子数组A[j+1..n]仍然在桌子上的牌堆。实际上,元素A[1..j-1]就是原来在位置1到j-1的元素,但现在已经重新排序,我们把A[1..j-1]的性质形式地表示为一个循环不变式。