c语言排序算法_插入排序算法 -- C语言

算法原理

直接插入排序的基本思想:

假设待排序的记录存放在数组 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

代码实现

#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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值