Algorithms————insertion_sort

来源:互联网 发布:网络摄像头安装步骤 编辑:程序博客网 时间:2024/06/15 23:16
void insertion_sort(enme a[],int count){    int i,key;    for(int j=1;j<=count-1;j++)    {        key = a[j];     //哨兵        i = j - 1;        while(i>=0 && a[i]>key)        {            a[i+1] = a[i];            i--;        }        a[i+1] = key;    }}
插入排序的大致思路为:
一组数,用下标作为索引,逐个比较,就如同排放手牌的时候,第一张不用比较,直接“插入”,第二张与前一张做比较,第一张较大的往后移一位,如果前面还有牌则继续比较,此时仅有一张牌,所以结束,继续抽下一张牌,继续比较,与它的前一张牌进行比较,第二张较大的往后移一位,与第一张做比较,若它比较大,比第一张大,则结束,不是则第一张往后移一位,最后,第三章替换此位置,如此循环,退出循环的条件是,所抽的牌较大可以在其中插入,或者牌比手中的牌都要小,则排在第一位。
这里面我隐约能感受到循环不变式,但是又说不出来,可能再看几遍就差不多了。
好了,我们可以看得出来,我们使用了两次循环,一次:抽牌,二次:比较,移位。那么可想我们的时间性能是有点差的,两次的循环感觉是n^2,我现在还不能独立计算,还很模糊,加油学习!