自己对插入排序的理解:插入排序是把一个记录插入到已排序的有序序列中,使整个序列在插入该记录后仍然有序。插入序列中较简单的一种方法是直接插入排序,其插入位置的确定方法是将待插入的记录与有序区中的各记录自右向左依次比较其关键字值的大小。本实例要求使用直接插入排序法将数组由小到大进行排序。
代码:
#include <stdio.h> #include <stdlib.h> /*声明排序函数*/ void insort(int s[],int n); /*监视哨:监视哨往往是程序里面的一个变量,如果是对数字排序的话,那么该变量一般是数值型变量。 变量的赋值就相当于哨兵,当排序数列中出现与哨兵相等的值或有某种既定关系出现时,就做一种操作, 比如说停止排序,或进行下一趟排序。*/ void main(void) { int *a,n,i,j; printf("请问您要输入几个数据?例如:10\n"); scanf("%d",&n); printf("请输入%d个数据:\t例如:20 15 46 21\n",n); a = (int *)malloc(sizeof(int) * n); /*数组指针,动态分配数组大小*/ for(i = 0;i < n;i++) scanf("%d",&a[i]); /*接收从键盘输入的数据存放到数组中*/ printf("原始顺序:"); for(i = 0;i < n;i++) printf("%5d",a[i]); insort(a,n); printf("\n排序后数据:"); for(i = 0;i < n;i++) printf("%5d",a[i]); printf("\n"); free(a); /*释放内存*/ system("pause"); } /*排序函数*/ void insort(int s[],int n) { int i,j,num; for(i = 1;i < n;i++) /*从第二个元素开始比较*/ { num = s[i]; /*监视哨,它就是要插入的数*/ j = i - 1; /*确定要比较元素的最右边位置*/ while(num < s[j]) /*当j<0的时候,s[j]返回一个很大的负值,条件不成立退出循环*/ { s[j + 1] = s[j];/*数据右移*/ j--; /*索引值左移,指向比较的下一个数*/ } s[j + 1] = num; } }