选择法排序指每次选择所要排序的数组中的最大值(由小到大排序则选择最小值)的数组元素,将这个数组元素的值与最前面没有进行排序的数组元素的值互换。以数字9、6、15、4、2为例,采用选择法实现数字按从小到大进行排序,每次交换的顺序如图8.17所示。
图8.17 选择法排序示意图
从图8.17可以发现,在第一次排序过程中将第一个数字和最小的数字进行了位置互换;而第二次排序过程中,将第二个数字和剩下的数字中最小的数字进行了位置互换;依此类推,每次都将下一个数字和剩余的数字中最小的数字进行位置互换,直到将一组数字按从小到大排序。
下面通过实例来看一下如何通过程序使用选择法实现数组元素从小到大的排序。
在本实例中,声明了一个整型数组和两个整型变量,其中整型数组用于存储用户输入的数字,而整型变量用于存储数值最小的数组元素的数值和该元素的位置,然后通过双层循环进行选择法排序,最后将排好序的数组进行输出。具体代码如下:
01 #include<stdio.h>/*包含头文件*/
02 int main() /*主函数main*/
03 {
04 int i,j; /*定义变量*/
05 int a[10];
06 int iTemp;
07 int iPos;
08 printf("为数组元素赋值:\n");
09 /*从键盘为数组元素赋值(成绩)*/
10 for(i=0;i<10;i++)
11 {
12 printf("a[%d]=",i);
13 scanf("%d",&a[i]);
14 }
15 /*从高到低排序*/
16 for(i=0;i<9;i++) /*设置外层循环为下标0~8的元素*/
17 {
18 iTemp = a[i]; /*设置当前元素为最大值*/
19 iPos = i; /*记录元素位置*/
20 for(j=i+1;j<10;j++) /*内层循环i+1到9*/
21 {
22 if(a[j]>iTemp) /*如果当前元素比最高值还高*/
23 {
24 iTemp= a[j]; /*重新设置最高值*/
25 iPos= j; /*记录元素位置*/
26 }
27 }
28 /*交换两个元素值*/
29 a[iPos] = a[i];
30 a[i] = iTemp;
31 }
32
33 /*输出数组*/
34 for(i=0;i<10;i++)
35 {
36 printf("%d\t",a[i]); /*输出制表位*/
37 if(i == 4) /*如果是第5个元素*/
38 printf("\n"); /*输出换行*/
39 }
40
41 return 0; /*程序结束*/
42 }
运行程序,显示结果如图8.18所示。
图8.18 选择排序运行图
从该实例代码和运行结果可以看出:
(1)声明一个整型数组a,并通过键盘为数组元素赋值。
(2)设置一个嵌套循环,第一层循环为前9个数组元素,并在每次循环时将对应当前次数的数组元素设置为最小值(如果当前是第3次循环,那么将数组中第3个元素(也就是下标为2的元素)设置为当前的最小值);在第二层循环中,循环比较该元素之后的各个数组元素,并将每次比较结果中较小的数设置为最小值,在第二层循环结束时,将最小值与开始时设置为最小值的数组元素进行互换。当所有循环都完成以后,就将数组元素按照从小到大的顺序重新排列了。
(3)循环输出数组中的元素,并在输出5个元素以后进行换行,在下一行输出后面的5个元素。
本文摘自明日科技出版的《零基础学C语言》,转载请注明出处!!!