参考文章: http://blog.youkuaiyun.com/yexinghai/archive/2009/10/10/4649923.aspx
该文章对插入排序的算法,是错误的。
直接插入排序
原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。
要点:设立哨兵,作为临时存储和判断数组边界之用。
实现:(我重新写了一个)
我们可以看到将无序区域的一个元素插入一个有序的时候,上述代码是一个一个比较,并且移位。将一个元素插入一个有序的序列,是否可以利用二分查找优化呢。于是,我又对上述代码进行了改进:
知识点:
1、memcpy不考虑重叠的情况;memmove考虑了重叠的情况。
2、int *pi; char *pc; void *pv; 假设指针的初始化的值都是0x0012ff40。
则pi+1的值是0x0012ff44; pc+1的值是0x0012ff41; pv+1编译错误,未知大小(类型)。针对32位系统。
3、对插入排序算法的优化。
4、对该插入的位置查找,二分查找的变种。
再给出一个标准二分查找算法: