适用于理解排序方法思路而不清楚代码如何实现的C语言入门者
简易流程图:
//插入排序,这里以6个数的排序为例
#include <stdio.h>
int main (void)
{
int a[6],i,j,mid,k;
printf("请输入需要排序的6个数\n");
for(i=0;i<6;i++)
scanf("%d",&a[i]) //将第一个数a[0]设为已排列好的数列,所以i从1开始
for(i=1;i<6;i++) //操作循环,6个数字做5次循环操作,a[i]为待插入数
{
j=0; //j为待插入位置,每次操作循环从0开始
while(j<i&&a[j]<a[i]) //待插入数与已排序数列比较,若待插入数比已排序数大
j++; //则待插入位置j往前移一位,以便插入正确位置
if(i!=j) //若i等于j,表明待插入数与插入位置一致,无需操作
for(k=i;k>j;k--) //i,j不相等,j一定<i,执行插入循环
{ //保证插入过程中已排好数列顺序不变
mid=a[k];
a[k]=a[k-1];
a[k-1]=mid;
}
}
printf("排序好的6个数为:\n");
for(i=0;i<6;i++)
printf("%d,",a[i]);
printf("\n");
return 0;
}
j为待插入位置,如果j<i,表明j在i的后面,但是后面的j++表示之后j可以等于i,但这么表达j是不可能大于i的,既j待插入位置只能在i和0之间
比如第一次循环时,i=1,j=0,那么j在i和0之间
也就是说j要么0要么1, 这时候已排序数列就一个数字,所以插入位置只能是0和1
a[i]为待插入数, 既a[i]是将要进已排序数组里面的,i就是待插入数的位置,如果待插入位置和待插入数的位置一样,证明不用交换顺序了,就这样就好了,然后就继续下一个i,也就是最大的操作循环for里的i++
找完了了 i , j 的位置,如果i,j不一样表明待插入数与插入位置不一样,需要移动,那么就需要那个插入循环(程序与流程图中有注释)完成,插入循环要保证插入过程中已排好数列顺序不变
完成这一轮,下一个 i 出现之后,那么 j 又从0开始,一个一个找,当a[j]>a[i] 表明待插入数比已排序数小(小的放后面),那么这就不是正确的位置,应当再找下一个,则j++.当a[j]<=a[i] (待插入数比已排序数大(小的放后面),证明就要插在这个位置(比前一个小,又比现在这个大,这个位置往后的数都要后移一位,这个由后面的插入循环k完成)就找到了自己的位置,或者直到找到最后一个j=i (插入到已排序数列最后的位置)。就找出了 j 的正确位置。然后开始插入操作(重复)