選擇法排序指每次選擇所要排序的數組中的最大值(由小到大排序則選擇最小值)的數組元素,將這個數組元素的值與最前面沒有進行排序的數組元素的值互換。以數字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語言》,轉載請注明出處!!!
