Description
用函数实现直接插入排序,并输出每趟排序的结果
输入格式
第一行:键盘输入待排序关键的个数n 第二行:输入n个待排序关键字,用空格分隔数据
输出格式
每行输出一趟排序结果,数据之间用一个空格分隔
输入样例
10 5 4 8 0 9 3 2 6 7 1
输出样例
4 5 8 0 9 3 2 6 7 1 4 5 8 0 9 3 2 6 7 1 0 4 5 8 9 3 2 6 7 1 0 4 5 8 9 3 2 6 7 1 0 3 4 5 8 9 2 6 7 1 0 2 3 4 5 8 9 6 7 1 0 2 3 4 5 6 8 9 7 1 0 2 3 4 5 6 7 8 9 1 0 1 2 3 4 5 6 7 8 9
算法描述:
简介:查找a[i](i=2,3…n)在已排好序的序列a[1]…a[i-1]中的插入位置,然后将a[i]插入到表长为i-1的有序序列a[1]…a[i-1]中,直到将r[n]插入到表长为n-1的有序序列a[1]…a[n-1]中,最后得到表长为n的有序序列。
详细:
(1)建立足够大的数组存放数据,从1开始存放,0为哨兵。
(2)题目要求为升序,首先从下表i=2开始找到 a[i-1]>a[i],然后将哨兵a[0]赋值为a[i]
(3)之后从i-1开始,将比哨兵大的项从后往前移动
(4)重复(2)(3)步骤,形成有序序列
#include <iostream>
/*
Description
用函数实现直接插入排序,并输出每趟排序的结果.
*/
int a[1000],n;
using namespace std;
void Travers()
{
for(int i=1; i<=n ; i++)
printf("%d ",a[i]);
printf("\n");
}
void Insersort(int *a)
{
int i,j;
for(i=2; i<=n; i++)
{
if(a[i-1]>a[i])//题目要求为升序,若遇到前一项比后一项的大的
{
a[0]=a[i];//a[0]处设为哨兵
for(j=i-1; a[0]<a[j]; j--)//比哨兵大的,从后往前移
a[j+1]=a[j];
a[++j]=a[0];//上一行j--后非目标位置,因此要++j
}
Travers();
}
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
printf("%d",a[i]);
}
Insersort(a);
return 0;
}