簡單的選擇排序算法實現代碼


 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]時,就什么都不做就好了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM