码迷,mamicode.com
首页 > 编程语言 > 详细

算法导论学习笔记:2.1-插入排序

时间:2015-07-05 19:48:25      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

不假思索的写出这样的代码:

/*N:数组长度*/
for (i = 1; i < N; i++){
    int t = i;
    while (t > 0?a[t]<a[t-1]:0){
        int k = a[t];
        a[t] = a[t - 1];
        a[t - 1] = k;
        t = t - 1;
    }
}

不停与前一个元素比较,如果顺序不对那么交换;如果顺序对了,那么原a[i]里的元素已经找到了位置。a[0..i-1]的元素都是有序的,也就是书中所谓的“循环不变式”。

  另:while循环中的表达式能不能写成“t > 0 && a[t] < a[t-1]”?似乎有可能出现访问越界?还请指点迷津。

而根据书上给出的伪代码写出来则是:

for (i = 1; i < N; i++){
    int t = a[i], j = i - 1;
    while (j >= 0 && a[j] > t){
        a[j + 1] = a[j];
        j--;
    }
    a[j + 1] = t;
}

没有明显的交换,实际上和“找出a[i]应在的位置a[k],将a[k+1..i-1]的元素后移一位”是相同的原理,但是书中这样写明显简洁了很多。

算法导论学习笔记:2.1-插入排序

标签:

原文地址:http://www.cnblogs.com/jasperx/p/4622712.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!