1 #include<stdio.h> 2 #define N 12 3 //length統計數組的長度 返回最后元素的下標 4 int length(int a [N]){ 5 for(int i = 0;i<=N;i++){ 6 if(a[i]==0) return i-1; 7 8 } 9 } 10 //打印輸出數組元素 11 void show(int a[N]){ 12 for(int i= 0;i<N;i++){ 13 if(a[i]!=0) printf("%4d",a[i]); 14 15 } 16 } 17 18 //簡單選擇排序 19 void selectsort (int a [N]){ 20 int min; 21 int dex ; //最小值下標 22 int temp ; 23 for(int k =0 ;k<=length(a)-1;k++) { //設置光標k 24 min = a [k] ; 25 for(int i = k;i<=length(a)-1;i++){ //找出最小值,放入數組光標最左邊位置,向右移動光標; 26 27 /*!!有這段語句排序就不起作用,為什么? if(min<a[i+1]) { 28 dex = k; 29 }*/ 30 if(min>a[i+1]){ 31 min = a[i+1] ; 32 dex = i +1 ; 33 } 34 } 35 temp = a[k] ; 36 a[k]=min; 37 a[dex] = temp ; 38 } 39 } 40 41 int main(void){ 42 int a [N] ={2,3,7,1,22,3,5,34,467} ; //手動生成數組a 43 printf("%d\n",length(a)); 44 selectsort(a); 45 show(a); //輸出 1 2 3 3 5 7 34 34 467 結果正確 46 return 0 ; 47 }
先上代碼。思路很簡單對在光標k左邊的元素不斷進行比較,將最小的那個插入最左邊。(這里說是插入,實際上是將最小元素與原最左元素進行互換,大多數排序算法里就沒有真正用到過插入的,這么說只是習慣)
如果將選擇排序的代碼改成如下形式
void selectsort (int a [N]){ int min; int dex ; //最小值下標 int temp ; for(int k =0 ;k<=length(a)-1;k++) { //設置光標k min = a [k] ; for(int i = k;i<=length(a)-1;i++){ //找出最小值,放入數組光標最左邊位置,向右移動光標; if(min<a[i+1]) { dex = k; } if(min>a[i+1]){ min = a[i+1] ; dex = i +1 ; } } temp = a[k] ; a[k]=min; a[dex] = temp ; } }
輸出結果變為2 3 7 1 22 3 5 34 467 這是需要注意的地方
if(min<a[i+1]) {
dex = k; } 這段代碼是沒有必要的,將代碼加入程序之后反而會得不到正確的結果。 當min<a[i+1]時,就什么都不做就好了。
