insertion sort 插入排序

首先声明:我是一个菜鸟,还是一个屌丝,就我目前的水平以及态度,很难像结构之法,算法之道的July那样写出篇幅巨大,讲解透彻的文章。

但是,我会按照我的理解写,理解到哪就写到哪,力求做到即使你跟我一样菜,也能理解。

通过写博客记录自己的成长过程,我觉得这不错!


以下是 wikipedia 对 insertion sort 给出的定义:

Insertion sort is a simple sorting algorithm: a comparison sort in which the sorted array (or list) is built one entry at a time. 

It is much less efficient on large lists than more advanced algorithms such as quicksort, heapsort, or merge sort.

However, insertion sort provides several advantages:

1. simple implementation

2. efficient for (quite) small data sets

3. adaptive for data sets that are already substantially sorted: the time complexity is O(n+d), where d is the number of inversions

4. more efficient in practice than most other simple quadratic algorithms such as selection sort or bubble sort; the best case is O(n)

5. stable. does not change the relative order of elements with equal keys

6. in-place. only requires a constant amount O(1) of additional memory space

7. online. can sort a list as it receives it.


说老实话,上面的这个定义我有很多也不明白,比如优点中, stable,online,这两个特点我就不明白是什么意思,希望有知道的朋友能分享一下。


整个算法的排序过程还是很容易理解的,我用一个例子来说明,比如我们手里拿了 9 张扑克牌,拿在手里的牌的顺序是: 9, 5, 4, 3, 2, 6, 7, 1, 8

把它看成是一个数组,我们需要把这个数组排序,也就是把手里的牌码顺了。


想想我们码牌的过程:

第一步,我们看到5,发现5<9,所以,把5和9调换顺序,手里的牌的顺序变成:

5, 9, 4, 3, 2, 6, 7, 1, 8


第二步,再看4,发现4<9, 4<5.   然后把4放在5和9的前面

4, 5, 9, 3, 2, 6, 7, 1, 8


第三步,再看3, 发现3<9, 3<5, 3<4. 吧3放在4,5和9的前面

3, 4, 5, 9, 2, 6, 7, 1, 8


第四步,再看下一个牌2,按照同样的规律,跟前面的牌一一做比较,发现2会拍到最前面

2, 3, 4, 5, 9, 6, 7, 1, 8


第五步, 这次看到下一张牌  6, 6<9 但是6>5,所以就把6放在5和9中间

2, 3, 4, 5, 6, 9, 7, 1 ,8


第六步,到7了,跟上一步有点像,把7放在6和9中间

2, 3, 4, 5, 6, 7, 9, 1, 8


第七部,到下张牌1, 1小于前面所有的牌,所以把1放到最前面,

1, 2, 3, 4, 5, 6, 7, 9, 8


最后,还剩一张牌8, 把8放到7和9中间

1, 2, 3, 4, 5, 6, 7, 8, 9


到此,手上的整副牌都被算法跑了一遍,整个排序过程就结束了。



贴出代码:


#include<stdio.h>



void insertion_sort(int x[], int length) {
        int key;
        int i;
        int j;
        int k;

        for(j=1; j<length; j++) {
                key = x[j];
                i = j-1;

                while(x[i]>key && i>=0) {
                        x[i+1] = x[i];
                        i--;
                }

                x[i+1] = key;

                printf("step %d:\n", j);
                for(k=0;k<length;k++)
                        printf("%d ", x[k]);
                printf("\n");
        }

}



int main() {
        int a[] = {9,5,4,3,2,6,7,1,8};


        printf("before sorting:\n");
        int i;
        for(i=0;i<9;i++) {
                printf("%d ", a[i]);
        }


        printf("\n");
        insertion_sort(a,9);

        printf("after sorting:\n");

        for(i=0;i<9;i++) {
                printf("%d ", a[i]);
        }

        printf("\n");

}




这就是整个排序的过程了,插入排序比较简单,我觉得只要想起这个扑克牌的例子,就能想起insertion sort是如何工作的。


当然,光知道怎么怎么运行还不够,我对自己的要求是,要能在5分钟的时间里,实现 insertion sort ,因为公司在面试的时候考察算法,让你当场写的话,这就稳赢了。



这是我第一篇关于算法的文章,不足之处,还请见谅,因为我关于自己学习过程的记录和总结。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值