#### 插入排序 >插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。 其实插入排序相当于玩扑克牌,当发牌过程,取上的第一张牌肯定是已经排好序的,当取上第二张或这后面的牌时候,都要跟第一张牌比较,如果比第一张牌小,放在第一张前面,否则置原处不动(放),如果取上第三张牌,则将第三张牌和第二张牌作比较,如果比第二张牌小,就继续跟第一张比较,后面的依次类推。 下图演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入。 <center> ![插入排序](http://images.cnblogs.com/cnblogs_com/kkun/201111/201111231433304812.png) </center> <center> 图片来自博文[经典排序算法 – 插入排序Insertion sort](http://www.cnblogs.com/kkun/archive/2011/11/23/2260265.html) </center> 插入排序的c语言实现 ```c /************************************************************************* > Function Name: insertSort > Function: 实现插入排序 > Author: 卢孙远 > Mail: 476941913@qq.com > Created Time: 2017年04月14日 星期五 00时26分52秒 ************************************************************************/ void insertSort(int a[],int arrayLen) { /*将要入已经排好序的队列*/ int p; for(p=1;p<arrayLen;p++){ int j; int temp = a[p]; /*将要大于或者等于 temp的数往后移动一位*/ for(j=p;j>0&&temp<a[j-1];j--){ a[j] = a[j-1]; } /*填写空位*/ a[j] = temp; } return ; } ``` 迭代器法 ``` template<typename RandomAccessIterator, typename T,typename Compare> void __unguarded_linear_insert(RandomAccessIterator first, T value, Compare comp) { RandomAccessIterator prev = first; --prev; while (comp(value, *prev)) { *first = *prev; first = prev; --prev; } *first = value; } template<typename RandomAccessIterator, typename Compare> void __linear_insert(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { typename std::iterator_traits<RandomAccessIterator>::value_type value = *last; if (comp(value, *first)) { std::copy_backward(first, last, last + 1); *first = value; } else __unguarded_linear_insert(last, value, comp); } template<typename RandomAccessIterator,typename Compare> void insert_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { for (RandomAccessIterator i = first + 1; i != last; ++i) { __linear_insert(first, i, comp); } } ``` ###### 关于源码和文章 可以查看并且可以加入改进:[git源代码](https://git.oschina.net/LSU/alg.git) 此文章的markdown笔记:[git笔记](https://git.oschina.net/LSU/shujujiegouyusuanfamarkdown.git)