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元素的數組中