实例要求:
使用直接插入排序法将输入的数字从小到大排序,效果如下图所示:
实现步骤:
直接插入排序就是把一个记录插入到已经排序的有序序列里,使整个序列在插入该记录后仍然有序。直接插入位置的确定方法是将待插入的记录与有序区中的各记录自右向左依次比较其关键词的大小。具体代码如下:
1.main()主函数作为程序的入口函数,负责键入数据、调用系统函数及自定义函数
void main()
{
int a[11], i; /*定义数组及变量为基本整型*/
printf("请输入10个数据:\n");
for (i = 1; i <= 10; i++)
scanf("%d", &a[i]); /*接收从键盘中输入的10个数据到数组a中*/
printf("原始顺序:\n");
for (i = 1; i < 11; i++)
printf("%2d", a[i]); /*将未排序前的顺序输出*/
insort(a, 10); /*调用自定义函数isort()*/
printf("\n插入数据排序后顺序:\n");
for (i = 1; i < 11; i++)
printf("%2d", a[i]); /*将排序后的数组输出*/
printf("\n");
}
2.自定义函数insort(),实现直接插入排序
void insort(int s[], int n) /*自定义函数isort s[]为数组,n为长度*/
{
int i, j;
for (i = 2; i <= n; i++) /*数组下标从2开始,0做监视哨,i=1无可比性*/
{
s[0] = s[i]; /*给监视哨赋值*/
j = i - 1; /*确定要进行比较的元素的最右边位置*/
while (s[0] < s[j])
{
s[j + 1] = s[j]; /*数据右移*/
j--; /*移向左边一个未比较的数*/
}
s[j + 1] = s[0]; /*在确定的位置插入s[i]*/
}
}
注意:
本算法中运用了监视哨,其目的是为了避免数据在后移时丢失。