C语言入门:插入排序(代码实现,而不是排序方法阐述)

来源:互联网 发布:上海威利旺卡学费知乎 编辑:程序博客网 时间:2024/05/26 07:29

适用于理解排序方法思路而不清楚代码如何实现的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 的正确位置。然后开始插入操作(重复)