天天看点

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

  一、插入排序:INSERTION-SORT

1、适用范围:

 which is an efficient algorithm for sorting a small number of elements.

对于少量元素的排序,插入排序是一种高效的算法。

2、原理:

Insertion sort works the way many people sort a hand of playing cards. We start with an empty left hand and the cards face down on the table.

We then remove one card at a time from the table and insert it into the correct position in the left hand.

To find the correct position for a card, we compare it with each of the cards already in the hand, from right to left,

插入排序原理和玩纸牌一样,我们原本左手中没有牌,牌都在桌子上放着,我们从桌子上取出一张牌,并插入到左手中。

第一次插入为直接插入,因为此时我们手中没牌,等到第二次插入时,我们和第一次插入的牌比较,将大的放在右边,小的放在左边。

第三次插入则是将从桌子上取的牌,和手中的每一张牌以从右往左的顺序比较,将牌插入到合适的位置。

3、插入排序伪代码:

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

说明:j代表索引,此处索引从1开始,而非0,插入时从第二个数字开始插入;

      循环不变式(上述插入排序的不变式为A[1..j-1]):用于帮助理解算法正确性,必须证明其三个性质:

  2.1-1 以图2-2模型为例,说明插入排序在数组A=[31,41,59,26,41,58]上的执行过程。

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

  2.1-2 重写Insert-sort,使之按照非升序(而非非降序)排序

 INSERT_SORT (A)

2.1-3  考虑下面的查找问题

 输入:一列数A=(a, a2,..., an)和一个值v。

 输出:下标i,使得v=A[i],或者当v不在A中出现时为NIL。

 写出针对这个问题的线性查找的伪代码,它顺序的扫描整个序列以查找v,利用循环不变式证明算法的正确性。确保所给出的循环不变式满足三个必要的性质。

伪代码(可能不符合标准,但基本意思表达):

2.1.4

有两个各存放数组A和B的n位二进制数,考虑他们的相加问题,两个整数的和以二进制形式存放在具有n+1个元素的数组C中,请给出这个问题的形式化描述,并写出伪代码。。

 解答:

继续阅读