插入排序算法

来源:互联网 发布:林岚 梦里花落知多少 编辑:程序博客网 时间:2024/06/07 21:53

今天看了一下插入排序,写下自己的理解 以便日后参考 。

插入排序算法类似于玩扑克抓牌的过程,玩家每拿到一张牌都要插入到手中已有牌的里面,使之从小到大排好序。比如我手中现在有2, 4, 5, 8,10 五张牌,我按照从小到大的顺序排好了,现在我又拿到了一张7,我会把这张牌从左到右(或从右到左)依次比较,7 比2 大,我再比较下一张,7又比4 大 ,再往下,依次类推一直到7比8小,好了我就把7放在了5 和 8的中间了。为什么我不用再比较7 和10的大小了呢?因为在我拿到7之前我手中的牌是排好序的 8之后的肯定 是比8大的,所以就不用再拿7和8相比了。现在我插入7之后手中的牌依然是排好序的,下次我拿到新的牌后还可以用此方法来插入。
编程对一个数组进行插入排序也是一样的道理,只是数组不能在两个相邻的存储单元之间再插入一个单元,所以要将插入点之后的数据依次往后移动一个单元。
比如我们现在有一个数组 a[5] = {10, 5, 2, 4, 7} 现在我们要怎么样来利用插入排序来为这个数组排序呢?
想想之前的扑克牌的例子。我们在排序之前有一个要求 :就是手中的牌是已排好序的。可是我现在的数组的根本没有什么顺序啊?
所以我们就要从最开始来排了 就好比你现在手里只有一张牌,你要拿第二张牌。现在我手里有一张牌10 现在我拿到了5 我用插入排序的方法 把他们排好 然后又拿了一张4。。。等等一直到最后5张牌拿完就ok了这样就完成了这个数组的排序了。
首先的比较时手中最少是有一张牌的 也就是说我们应该是从第二张开始比较的
int i, k, key; /*key存储的就是我们拿到的那张牌*/
for(k = 1; k < LEN; k++) /*LEN为a的长度*/
{
key = a[k];
i = k - 1;
while(i >= 0 && a[i] > key) {
a[i+1] = a[i]; /*把之key大的元素往后移一位*/
i--;
}
a[i+1] = key; /*把key插入进去*/
}
这样就完成了插入排序了 呵呵 个人感觉配合这个例子还是蛮好理解的!!!(参考资料为linux c编程一站式学习,示例皆为书中的)