算法基础

1.插入排序

  我们通常将算法描述为一种伪代码书写的程序,该伪代码在许多方面类似于C,C++Java,Pascal。伪代码与真代码的区别在于,在伪代码中,

  我们使用最清晰,最简洁的表示方法来说明给定的算法。有时最清晰的表示方法是英语。伪代码与真码点另一个区别是伪代码通常不关心软

  件工程问题。为了更简洁的表达算法的本质,常常忽略数据抽象,模块性和错误处理的问题。插入排序对于少量的元素的排序,他是一个有

  效的算法。插入排序的工作方式向许多人排序扑克牌一样。对于插入排序,我们将其伪代码过程命名为INSERTION-SORT,其中的参数是

  一个数组A『1..n』,包含长度为n的要排序的一个序列。该算法原址排序输入的数:算法在数组A中重拍这些数,在任何时候,最多只有

  其中的常数个数字存储在数组外面,在过程INSERTION-SORT结束时,输入数组A包含排序好的输出序列。

  INSERTION-SORT(A)

  for j = 2 to A.length

       key = A『j』

       i =  j - 1

      while i > 0 and A [i] >key

             A[i + 1]= A[i]

            i = i - 1

     A[i + 1] = key

  在for循环的每次迭代的开始,包含元素A【1..j-1】的子数组构成了当前排序号的数列,剩余的子数组A【j+1..n】对应于未排列的数组,

  实际上元素A【1..j-1】就是原来在位置1到j-1的元素,但现在已经按序排列。我们把A【1..j-1】这些性质形式的表示为一个循环不变式。

  循环不变式主要用来帮助我们理解算法的正确性。

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

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

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

  当两条性质成立时,在循环的每次迭代之前循环不变式为真。注意类似于数学归纳法,之中为了证明该某条性质成立,需要证明一个基本

  情况和一个归纳步。这里,证明迭代之前不变式成立对应于基本情况,证明从下一次迭代之前,到下一次迭代不变式成立对应于归纳步。

  第三条性质也是非常重要的,因为我们将使用循环不变式来证明,正确性。通常我们和导致循环终止的条件一起使用循环不变式。中执行

  不同于我们通常使用数学归纳法的做法,在归纳法中,归纳步是无限的使用的,在这里当循环终止时,停止“归纳”。

posted @ 2016-09-28 16:43  都是木头  阅读(127)  评论(0编辑  收藏  举报