算法原理
直接插入排序的基本思想:
假设待排序的记录存放在数组 R[1… n] 中。初始时,R[1] 自成1个有序区,无序区为R[2… n]。从 i= 2 起直至 i= n 为止,依次将R[i] 插入当前的有序区R[1... i- 1] 中,生成含 n 个记录的有序区。
第 i-1 趟直接插入排序:通常将一个记录R[i](i= 2,…,n- 1)插入到当前的有序区,使得插入后仍保证该区间里的记录是按关键字有序的操作,称为第i-1 趟直接插入排序。排序过程的某一中间时刻,R 被划分成两个子区间:R[1… i-1](已排好序的有序区)和 R[i… n](当前未排序的部分,可称为无序 区)。直接插入排序的基本操作是将当前无序区的第1个记录 R[i] 插入到有序区R[1… i-1] 中适当的位置上,使 R[1… i] 变为新的有序区。因为这种方法每次使有序区增加 1 个记录,通常称为增量法。
插入排序与打扑克时整理手上的牌非常类似。摸来的第1张牌无须整理,此后每次从桌上的牌(无序 区)中摸最上面的1 张并插入左手的牌(有序 区)中正确的位置上。为了找到这个正确的位置,须自左向右(或自右向左)将摸来的牌与左手中已有的牌逐一比较。
算法草稿
![52524d7ea96a84a00e5070aa155be12b.png](https://img-blog.csdnimg.cn/img_convert/52524d7ea96a84a00e5070aa155be12b.png)
代码实现
#include #include #define SUCCESS0#define PARAM_ERR-1 int InsertSort(int * array, int size){if(NULL == array){printf("%s para error", __func__);return PARAM_ERR;} int i = 0, j = 0;int insert = 0;int loc = 0;#ifdef DEBUGint k = 0;#endif for(i = 0; i < size; i++){insert = array[i];/*升序*/ /*insert 是最大的,不改变,进入下一轮插入排序*/if(insert > array[i-1]){goto info;} /*在有序区域查找合适的插入位置*/loc = i-1; //初始插入位置认为在最后一个上for(j = i - 1; j >= 0; j--){if(insert >= array[j]){#ifdef DEBUGprintf("find loc insert %d > array[%d] = %d", insert, j, array[j]);#endifbreak;}loc = j;} /*有序区从插入位置向后移动*/for(j = i; j > loc; j--){array[j] = array[j-1];}array[loc] = insert; info:#ifdef DEBUGprintf("i = %d insert = %d, loc = %d", i, insert, loc);printf("[");/*有序区域*/for(k =0; k < i+1; k++){printf(" %d ", array[k]);}printf("] "); /*无序区域*/printf("[");for(k =i+1; k < size; k++){printf(" %d ", array[k]);}printf("]");printf("");#endifcontinue;} return SUCCESS;} int main(int argc, char ** argv){int array[10] = {7,3,5,8,0,9,1,2,4,6};int i = 0; printf("Before sort: ");for(i = 0; i < 10; i++){printf(" %d ", array[i]);}printf(""); InsertSort(array, 10); printf("after sort: ");for(i = 0; i < 10; i++){printf(" %d ", array[i]);}printf("");return 0;}
调试编译
gcc InsertSort.c -DDEBUG
调试输出
输出格式
[有序区域][无序区域]
Before sort: 7 3 5 8 0 9 1 2 4 6i = 0 insert = 7, loc = 0[ 7 ] [ 3 5 8 0 9 1 2 4 6 ] i = 1 insert = 3, loc = 0[ 3 7 ] [ 5 8 0 9 1 2 4 6 ] find loc insert 5 > array[0] = 3i = 2 insert = 5, loc = 1[ 3 5 7 ] [ 8 0 9 1 2 4 6 ] i = 3 insert = 8, loc = 1[ 3 5 7 8 ] [ 0 9 1 2 4 6 ] i = 4 insert = 0, loc = 0[ 0 3 5 7 8 ] [ 9 1 2 4 6 ] i = 5 insert = 9, loc = 0[ 0 3 5 7 8 9 ] [ 1 2 4 6 ] find loc insert 1 > array[0] = 0i = 6 insert = 1, loc = 1[ 0 1 3 5 7 8 9 ] [ 2 4 6 ] find loc insert 2 > array[1] = 1i = 7 insert = 2, loc = 2[ 0 1 2 3 5 7 8 9 ] [ 4 6 ] find loc insert 4 > array[3] = 3i = 8 insert = 4, loc = 4[ 0 1 2 3 4 5 7 8 9 ] [ 6 ] find loc insert 6 > array[5] = 5i = 9 insert = 6, loc = 6[ 0 1 2 3 4 5 6 7 8 9 ] [] after sort: 0 1 2 3 4 5 6 7 8 9