插入排序是把一个记录插入到已排序的有序序列中,使整个序列在插入该记录后仍然有序。插入排序中较简单的一种方法是直接插入排序,其插入位置的确定方法是将待插入的记录与有序区中的各记录自右向左依次比较其关键字值的大小。
核心算法:直接插入排序
设定待插入元素左边的元素都是按从小到大有序排列
①从s[2]开始往右依次选择待插入的元素s[i]存入s[0]中,则s[i]空闲。
②将待插入的元素s[i]与它左边的各元素比较(往左第一个,往左第二个……依次),若有比它大的,则将与它比较的元素向右移一个单位。
③将s[0]中存放的待插入的元素插入s[j+1]的位置
可自定义函数insort() 将一组数据从小到大排列:
void insort(int s[],int n)
{
int i,j;
for(i=2;i<=n;i++)
{
s[0]=s[i];
j=i-1;
while(s[0]<s[j])
{
s[j+1]=s[j];
j–;
}
s[j+1]=s[0];
}
}
注意:
①监视哨的作用,存放后面的数据,防止前面的数据在后移时导致后面的数据丢失。
详见直接插入排序——监视哨的作用
②对于数组中数据的输入和输出要结合循环结构才能使用
③以数组为参数的函数的使用:
定义:函数返回值类型 函数名(形参数组类型 形参数组名[])
(形参列表中通常还会包含一个与形参数组长度有关的形参变量)
作为实参的数组的定义:数组类型 数组名[数组长度]
为作为实参的数组赋初值通过scanf()函数,让用户从键盘输入
直接将数据写进代码里调用:函数名(实参数组名)
④被调函数函数体内定义的变量,不需再在主调函数中定义;
主调函数中定义的变量和被调函数中定义的变量可以同名。
例:从键盘输入10个数字,使用直接插入排序法将数字由小到大进行排序并输出。
#include<stdio.h>
void insort(int s[],int n)/*n为输入数据的个数,可用来定义数组s[n]*/
{
int i,j;
for(i=2;i<=n;i++)/*数组下标从2开始,从左往右选择要插入的元素,s[0]做监视哨,s[1]一个数据无可比性*/
{
s[0]=s[i];/*将要插入的元素的值赋给监视哨,此后即便s[i]的数据被覆盖也不会导致丢失,可称s[i]空闲*/
j=i-1;/*为j赋初值,确定要插入的元素向左一个单位的元素*/
while(s[0]<s[j])/*当要插入的元素比左边的数据小时*/
{
s[j+1]=s[j];/*将左边的数据向右移一个单位*/
j--;/*继续与再左边一个数据比较,直到再左一个数据不右移,j=j-1,s[j+1]空闲*/
}
s[j+1]=s[0];/*在确定的位置插入s[i]*/
}
}
int main()
{
int a[11],i;
printf("请输入10个数据:\n");
for(i=1;i<=10;i++)
scanf("%d",&a[i]);/*接收从键盘输入的10个数据到数组a,数组下标从1开始,a[0]做监视哨*/
printf("原始序列:\n");
for(i=1;i<11;i++)
printf("%5d",a[i]);/*%5d不仅控制了输出的整数位数,还使各数据间隔开来*/
insort(a,10);
printf("\n插入数据排序后序列:\n");
for(i=1;i<11;i++)
printf("%5d",a[i]);
printf("\n");
return 0;
}
但是我有一个问题就是为什么我将while语句改成for语句之后就不行了呢?
来源:CSDN
作者:又摘桃花换酒钱kk
链接:https://blog.csdn.net/qq_45729984/article/details/104613099