插入法排序较为复杂,其基本工作原理是抽出一个数据,在前面的数据中寻找相应的位置插入,直到完成排序。以数字9、6、15、4、2为例,采用插入法实现数字按从小到大进行排序,插入法排序过程如图8.23所示。
图8.23 插入法排序过程示意图
从图8.23可以发现,在第一次排序过程中将第一个数取出来,并放置在第一个位置;然后取出第二个数,并将第二个数与第一个数进行比较,如果第二个数小于第一个数,则将第二个数排在第一个数之前,否则将第二个数排在第一个数之后;然后取出下一个数,先与排在后面的数字进行比较,如果当前数字比较大则排在最后,如果当前数字比较小,还要与之前的数字进行比较,如果当前数字比前面的数字小,则将当前数字排在比它小的数字和比它大的数字之间,如果没有比当前数字小的数字,则将当前数字排在最前方;依此类推,不断取出未进行排序的数字与排序好的数字进行比较,并插入到相应的位置,直到将一组数字按从小到大排序为止。
下面通过实例来看一下如何通过程序使用插入法实现数组元素从小到大的排序。
实例 利用插入排序法,从少到多输出显示老年人的数量
政府福利,根据老年人数发放养老补助。在本实例中,声明了一个整型数组和两个整型变量,其中整型数组用于存储用户输入的数字,而两个整型变量分别作为两个元素交换时的中间变量和记录数组元素位置,然后通过双层循环进行插入法排序,最后将排好序的数组进行输出。具体代码如下:
01 #include<stdio.h>/*包含头文件*/ 02 int main() /*主函数main*/ 03 { 04 int i; /*定义变量*/ 05 int a[10]; 06 intiTemp; 07 intiPos; 08 printf("输入老人数: "); /*提示信息*/ 09 for(i=0;i<10;i++) /*输入老人数据*/ 10 { 11 printf("a[%d]=",i); 12 scanf("%d", &a[i]); 13 } 14 15 /*从小到大排序*/ 16 for(i=1;i<10;i++) /*循环数组中元素*/ 17 { 18 iTemp = a[i]; /*设置插入值*/ 19 iPos = i-1; 20 while((iPos>=0) && (iTemp<a[iPos])) /*寻找插入值的位置*/ 21 { 22 a[iPos+1] = a[iPos]; /*插入数值*/ 23 iPos--; 24 } 25 a[iPos+1] = iTemp; 26 } 27 28 /*输出数组*/ 29 for(i=0;i<10;i++) 30 { 31 printf("%d ",a[i]); /*输出制表位*/ 32 if(i == 4) /*如果是第5个元素*/ 33 printf(" "); /*输出换行*/ 34 } 35 printf(" "); 36 37 return 0; /*程序结束*/ 38 }
运行程序,显示结果如图8.24所示。
图8.24 插入法排序运行图
从该实例代码和运行结果可以看出:
(1)声明一个整型数组a,并通过键盘为数组元素赋值。
(2)设置一个嵌套循环,第一层循环为后9个数组元素,将第二个元素赋值给中间变量,并记录前一个数组元素的下标位置。在第二层循环中,首先要判断是否符合循环的条件,允许循环的条件是记录的下标位置必须大于等于第一个数组元素的下标位置,并且中间变量的值小于之前设置下标位置的数组元素,如果满足循环条件,则将设置下标位置的数组元素值赋值给当前的数组元素。
(3)然后将记录的数组元素下标位置向前移动一位,继续进行循环判断。内层循环结束以后,将中间变量中保存的数值赋值给当前记录的下标位置之后的数组元素,继续进行外层循环,将数组中下一个数组元素赋值给中间变量,再通过内层循环进行排序。
(4)依此类推,直到循环结束,这时就将数组元素按照从小到大的顺序重新排列了。
(5)循环输出数组中的元素,并在输出5个元素后进行换行,在下一行输出后面的5个元素。
本文摘自明日科技出版的《零基础学C语言》,转载请注明出处!!!