Description
有n个无序的整数,试把它们从大到小排序。
要求:本题采用直接插入排序法来完成。
Input
输入共有2行,第一行是一个整数n
( 0 < n ≤ 100000 ),表示有n个整数。
第二行是n个整数(在int表示范围之内),每个整数之间有一个空格分隔。
Output
输出每一趟直接插入排序的结果,一趟一行。
Sample Input
5
8 4 1 5 7
Sample Output
8 4 1 5 7
8 4 1 5 7
8 5 4 1 7
8 7 5 4 1
直接排序:将序列分为有序序列和无序序列,依次从无序序列中取出元素插入到有序序列的合适位置。初始是有序序列中只有第一个数,其余n-1个数组成无序序列。
解法源代码:
#include
int a[100001];
int main()
{
int
n,i,j,t;
scanf("%d",&n);
for(i=0;i
scanf("%d",&a[i]);
for(i=1;i
{
t=a[i];//将待插入数暂存于变量t中
for(j=i-1;j>=0&&a[j];j--)//在有序序列(下标0~i-1)中寻找出入位置
{
a[j+1]=a[j];//未找到插入点则当前元素后移一个位置,为插入元素准备空间
}
a[j+1]=t;//找到插入位置,完成插入
for(j=0;j
printf("%d ",a[j]);
printf("%d\n",a[n-1]);
}
return 0;
}
将序列分为有序序列和无序列,
依次从无序序列中取出元素值插入到有序序列的合适位置。
初始
是有序序列中只有第一个数,其余
n-1
个数组成无序序列,则
n
个数需进
n-1
次插入。寻找在有序序列中插入位
置可以从有序序列的最后一个数往前找,在未找到插入点之前可以同时向后移动元素,为插入元素准备空间。
将序列分为有序序列和无序列,
依次从无序序列中取出元素值插入到有序序列的合适位置。
初始
是有序序列中只有第一个数,其余
n-1
个数组成无序序列,则
n
个数需进
n-1
次插入。寻找在有序序列中插入位
置可以从有序序列的最后一个数往前找,在未找到插入点之前可以同时向后移动元素,为插入元素准备空间。
将序列分为有序序列和无序列,
依次从无序序列中取出元素值插入到有序序列的合适位置。
初始
是有序序列中只有第一个数,其余
n-1
个数组成无序序列,则
n
个数需进
n-1
插入排序关键是找到可以插入的位置。就好像我们按身高由左到右从高到矮排队。以第二个同学为标准,把人分为左边有序,右边无序。从左边开始,第一个同学和第二个同学比较,如果第一个同学比第二个同学高,则不变,继续以第三个同学为标准做类似的比较。若第一个同学比第二个同学高,则第二个同学插入到第一个同学前面。
如8 4 1 5 7
第一次:以 4为标准。8和4比较,结果:8 4 1 5
7
第二次:以 1为标准。4和1比较,8和1比较,结果:8 4 1 5
7
第二次:以 5为标准。1和5比较,4和5比较,8和5比较,结果:8 5 4
1 7
第四次:以
7为标准。5和7比较,1和7比较,4和7比较,8和7比较,得:87541