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元素的数组中