//插入排序是把一个记录插入到已经排好序的有序序列中,使整个有序序列在插入了该记录之后
//仍然有序,插入排序中较为简单的一种方法便是直接插入排序,其插入位置的确定就是
//通过将待插入的序列与有序区中的各记录自右向左以此比较其关键字值大小来确定的
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
//要求:从键盘输入10个数据,使用直接插入排序法对这组数字由小到大进行排序(本算法使用监视哨:第一个为下标0的作为监视哨,然后依次是2,3,4......监视哨的作用是避免数据移动时丢失)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void insert(int s[], int n)
{
int i, j;
for (i = 2; i <= n; i++)//数组下标的比较从2开始,0作为监视哨(前面保证有两个数据,是有序序列)
{
s[0] = s[i];//给监视哨赋值
j = i - 1;//确定要比较的元素的最右边的值
while (s[0] < s[j])//若监视哨的值小于最右边的值
{
s[j + 1] = s[j];//数据右移
j--;//移到左边一个数据进行比较
}
s[j + 1] = s[0];//转移监视哨
}
}
int main()
{
int i;
int a[11];//定义数组及变量为基本整型
printf("Please iniput 10 numbers:\n");
for (i = 1; i <= 10; i++)
{
scanf("%d", &a[i]);//接收从键盘中输入的10个数据存储到数组中
}
printf("the original array order is:");
for (i = 1; i < 11; i++)
{
printf("%5d", a[i]);
}
insert(a, 10);//调用insert函数,且将数组与数组个数传进去
printf("\nthe next array order is:");
for (i = 1; i < 11; i++)
{
printf("%5d", a[i]);
}
printf("\n");
}