您的位置:首页 > 其它

insertion sort 插入排序

2011-12-16 11:21 295 查看
首先声明:我是一个菜鸟,还是一个屌丝,就我目前的水平以及态度,很难像结构之法,算法之道的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 ,因为公司在面试的时候考察算法,让你当场写的话,这就稳赢了。

这是我第一篇关于算法的文章,不足之处,还请见谅,因为我关于自己学习过程的记录和总结。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: