插入算法是一种很容易想到的算法,它的思路与打扑克时排列手牌的方法很相似。比如我们现在单手拿牌,然后要将牌从左到右,大到小进行排序。此时我们需要将牌一张一张抽出来,分别插入到前面已经排好序的手牌中的适当位置。重复这一操作直到插入最后一张牌,整个排序就完成了。
插入排序算法如下:
1. insertionSort(A,N) //包含N个元素的0的起点的数值A
2. for i 从 1 到 N-1
3. v= A[i]
4. j=i-1
5. while j>=0 且 A[j]>v
6. A[j+1]=A[j]
7. j++
8. A[j+1]=v
- 输入 在第1行输入定义数组长度的整数N。在第2行输入N个整数,以空格隔开。
- 输出输出总有N行。插入排序每个计算步骤的中间结果各占用1行。数列的各个元素之间空1个空格。请注意,行尾元素后的空格等多余的空格和换行会被认定为Presentation Error。
- 限制 1<=N<=100
- 输入示例
6
5 2 4 6 1 3- 输出示例
5 2 4 6 1 3
2 5 4 6 1 3
2 4 5 6 1 3
1 2 4 5 6 3
1 2 3 4 5 6
步骤
- 将开头的元素视作已排序
- 执行下述处理,直至未排序部分消失为止
1.取出未排序部分的开头元素赋给变量v。
2.在已排序部分,将所有比v大的元素向后移动一个单位。
3.将已取出的元素v插入空位。
参考答案
#include<stdio.h>
/* 按顺序输出数组元素*/
void trace(int A[],int N){
int i;
for(i=0;i<N;i++){
if(i>0) printf(" ");/* 在相邻元素间输出一个空格 */
printf("%d",A[i]);
}
printf("\n");
}
/*插入排序(0起始数组)*/
void insertionSort(int A[],int N){
int i,j,v;
for(i=1;i<N;i++){
v=A[i];
j=i-1;
while(j>=0&&A[j]>v){
A[j+1]=A[j];
j--;
}
A[j+1]=v;
trace(A,N);
}
}
int main(){
int N,i,j;
int A[100];
scanf("%d",&N);
for(i=0;i<N;N++)
scanf("%d",&A[i]);
trace(A,N);
insertionSort(A,N);
return 0;
}