简单的选择排序算法实现代码

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

猜你喜欢

转载自www.cnblogs.com/Insertt/p/11724963.html