连载3---第2章:开始(2.1:插入排序)

2.1:插入排序

       插入排序就比较形象的例子就是我们玩牌中"抓牌并插牌"的操作,我们左有拿牌,右手抓牌,抓完后要向左手已经有的牌中插入合适的位置,找合适的位置有两种顺序,从大到小找,或者从小到大找.

       比较通俗的说法,插入排序就是把一个个数插入到已经排好序的序列中

       定义插入排序作为一个过程:INSERTION-SORT,这个过程有一个参数:数组A[1-n],过程执行完后数组A是一个排完序的数组

       先用伪代码写一遍算法过程

       INSERTION-SORT(A)

            for j<---2 to length[A]

                 do key<---A[j]

                 插入A[j]到已经排好序的序列中(A[1---(j-1)]),从后往前找出位置,然后插入相应的位置位置

                 i<---j-1

                 while i>0 and A[i]>key

                       do A[i+1]<---A[i]

                             i<---i-1

                 A[i+1]<---key

以下是c语言调试的算法(注意数组的下标是从0开始的):

#include <stdio.h>

#define N 6

void INSERTION_SORT();

void INSERTION_SORT(int A[N])
{
 int i;
 int j;
 int k;
 int key;

 printf("start run INSERTION_SORT()/n");
 
 for(j=1;j<N;j++)
 {
  key=A[j];      /*找出当前要插入的数*/
  i=j-1;                 /*从当前要插入的数的前一个位置开始查*/
  while(i>=0&&A[i]>key)  /*找出要插入的位置,从后往前找*/
  {
   A[i+1]=A[i];       /*找的过程中同时换位置*/
   i=i-1;
  }
  A[i+1]=key;      /*把数插入到找到的位置*/
  
  printf("the %d time SORT(%d)/n",j,key);
  for(k=0;k<N;k++)
  {
   printf("%d/t",A[k]);
  }
  printf("/n");
 } 
 
 printf("end run INSERTION_SORT()/n");
}

void main()
{
 int i;
 static int a[N]={50,20,40,60,10,30};

 printf("start run main/n");
 printf("before SORT/n");
 /*排序前*/
 for(i=0;i<N;i++)
 {
  printf("%d/t",a[i]);
 }
 printf("/n");

 INSERTION_SORT(a);

 /*排序后*/
 printf("after SORT/n");
 for(i=0;i<N;i++)
 {
  printf("%d/t",a[i]);
 } 
 printf("/n");

 printf("end run main/n");
}

看执行结果:

习题:
1.写出用插入排序实现一组数的排序过程:31,41,59,26,41,58
答:31,41,59,26,41,58
   31,41,59,26,41,58
   26,31,41,59,41,58
   26,31,41,41,59,58
   26,31,41,41,58,59
2.重新写插入排序算实现"非递减"算法
3.考虑下面的搜索问题
  输入:一组数,一共n个,A=a1,a2,a3.....,an 和v
  输出:下表i,使v=A[i]如果序列中没有,则找出最接近的那个
  写出搜索算法,证明算法的正确性
4.考虑两个n位数相加的问题,两个n位数分别存在两个n元素数组A和B中,结果存在n+1元素的数组中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值