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
到此,手上的整副牌都被算法跑了一遍,整个排序过程就结束了。
贴出代码:
这就是整个排序的过程了,插入排序比较简单,我觉得只要想起这个扑克牌的例子,就能想起insertion sort是如何工作的。
当然,光知道怎么怎么运行还不够,我对自己的要求是,要能在5分钟的时间里,实现 insertion sort ,因为公司在面试的时候考察算法,让你当场写的话,这就稳赢了。
这是我第一篇关于算法的文章,不足之处,还请见谅,因为我关于自己学习过程的记录和总结。
但是,我会按照我的理解写,理解到哪就写到哪,力求做到即使你跟我一样菜,也能理解。
通过写博客记录自己的成长过程,我觉得这不错!
以下是 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 ,因为公司在面试的时候考察算法,让你当场写的话,这就稳赢了。
这是我第一篇关于算法的文章,不足之处,还请见谅,因为我关于自己学习过程的记录和总结。
相关文章推荐
- Insertion_Sort(插入排序)
- Insertion Sort List 链表的插入排序
- 链表插入排序(insertion-sort-list)
- 插入排序(INSERTION_SORT)
- insertion sort(插入排序)
- 算法学习记录-排序——插入排序(Insertion Sort)
- 排序算法——插入排序(Insertion Sort)
- 插入排序(insertion sort)
- Insertion Sort(插入排序)
- 经典排序算法 – 插入排序Insertion sort
- [MIPS汇编语言]InsertionSort插入排序
- 算法从排序开始——插入排序(Insertion Sort)C语言及Java实现
- 插入排序 (Insertion sort)
- LeetCode Insertion Sort List 链表的插入排序
- 插入排序(1)InsertionSort
- Insertion_Sort(插入排序)
- 插入排序——Insertion Sort
- 排序算法(一)—插入排序(Insertion sort)
- 算法-插入排序(Insertion Sort)
- 插入排序(Insertion Sort)