输入:n个数的一个序列(a1,a2……an)。
输出:输入序列的一个排序(a1,a2,……,an),满足a1<=a2<=……an。
首先,对于少量元素的排序,插入排序是一种有效的算法。举个生动的例子,插入排序就像我们手里刚刚分到的扑克牌,乱序。我们会将排由左到右进行整理,由小到大排序。
待排序列
5 4 3 9 7 5 3 2 1
(1)第一次操作由第2个元素开始,跟第一个元素比较,产生序列(前第一个黑体元素为待排元素,下同)
4 4 5 3 9 7 5 3 2 1
(2)第二次操作由第三个元素开始,跟第二个元素比较,3<5,5向后移一个单位,之后再跟第一个元素比较3<4,4向后移一个单位,产生序列
3 3 4 5 9 7 5 3 2 1
(3)第三次操作由第四个元素开始,跟第三个元素比较,9>5,停止比较,产生新的序列
9 3 4 5 9 7 5 3 2 1
(4)之后每次操作同上诉产生的新序列分别如下:
第五个元素操作后序列:7 3 4 5 7 9 5 3 2 1
第六个元素操作后序列:5 3 4 5 5 7 9 3 2 1
第七个元素操作后序列:3 3 3 4 5 5 7 9 2 1
第八个元素操作后序列:2 2 3 3 4 5 5 7 9 1
第九个元素操作后序列:1 1 2 3 3 4 5 5 7 9
其算法过程:
INSERTION_SORT(a,n)
{
for(i=2;i<=n;i++)
{
kry=a[i];
j=i-1;
while(j>0&&key<a[j])
{
a[j+1]=a[j];
j--;
}
a[j+1]=key;
}
}
其实现代码:
#include <stdio.h>
#include <stdlib.h>
int InsertionSort(int A[10],int n)
{
int i,j,key;
for(i=2;i<=10;i++)
{
key=A[i];
for(j=i-1;j>0;j--)
while(A[j]>key)
{
A[j+1]=A[j];
j=j-1;
A[j+1]=key;
}
}
return A[10];
}
int main(){
int A[10],i;
for(i=1;i<=10;i++)
scanf("%d",&A[i]);
InsertionSort(A,10);
for(i=1;i<=10;i++)
printf("%d ",A[i]);
return 0;
}
“`
2970

被折叠的 条评论
为什么被折叠?



