基础排序算法 – 选择排序Selection sort

直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,

顺序放入新数组,直到全部拿完

再简单点,对着一群数组说,你们谁最小出列,站到最后边

然后继续对剩余的无序数组说,你们谁最小出列,站到最后边

再继续刚才的操作,一直到最后一个,继续站到最后边,现在数组有序了,从小到大

举例

先说看每步的状态变化,后边介绍细节。

现有无序数组[6 2 4 1 5 9]

第一趟找到最小数1,放到最前边(与首位数字交换)

交换前:| 6 | 2 | 4 | 1 | 5 | 9 |

交换后:| 1 | 2 | 4 | 6 | 5 | 9 |

第二趟找到余下数字[2 4 6 5 9]里的最小数2,与当前数组的首位数字进行交换,实际没有交换,本来就在首位

交换前:| 1 | 2 | 4 | 6 | 5 | 9 |

交换后:| 1 | 2 | 4 | 6 | 5 | 9 |

第三趟继续找到剩余[4 6 5 9]数字里的最小数4,实际没有交换,4待首位置无须交换

第四趟从剩余的[6 5 9]里找到最小数5,与首位数字6交换位置

交换前:| 1 | 2 | 4 | 6 | 5 | 9 |

交换后:| 1 | 2 | 4 | 5 | 6 | 9 |

第五趟从剩余的[6 9]里找到最小数6,发现它待在正确的位置,没有交换

排序完毕输出正确结果[1 2 4 5 6 9]

第一趟找到最小数1的细节

当前数组是| 6 | 2 | 4 | 1 | 5 | 9 |

先把6取出来,让它扮演最小数

当前最小数6与其它数一一进行比较,发现更小数就交换角色

当前最小数6与2比较,发现更小数,交换角色,此时最小数是2,接下来2与剩余数字比较

当前最小数2与4比较,不动

当前最小数2与1比较,发现更小数,交换角色,此时最小数是1,接下来1与剩余数字比较

当前最小数1与5比较,不动

当前最小数1与9比较,不动,到达末尾

当前最小数1与当前首位数字进行位置交换,如下所示

交换前:| 6 | 2 | 4 | 1 | 5 | 9 |

交换后:| 1 | 2 | 4 | 6 | 5 | 9 |

完成一趟排序,其余步骤类似

C语言代码:

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int a[5]={5,4,3,2,1},i;
 5  
 6     printf("原本的数字为:");
 7      for(i=0;i<5;i++)
 8     {
 9         printf("%d ",a[i]);
10     }
11     printf("\n");
12  
13     void choose (int a[],int n);
14     choose (a,5);
15  
16     printf("选择法排序后:");
17     for(i=0;i<5;i++)
18     {
19         printf("%d ",a[i]);
20     }
21     return 0;
22 }
23  
24 //选择法
25 void choose (int a[],int n)
26 {
27     int i,j,k,temp;
28     for(i=0;i<n-1;i++)
29     {
30         k=i;//给记号赋值
31         for(j=i+1;j<n;j++)
32         {
33             if (a[k]>a[j]);
34             {
35             k=j;//使k总是指向最小元素
36             }
37             if (i!=k)//当k!=i时才交换
38             {
39                 temp=a[i];
40                 a[i]=a[k];
41                 a[k]=temp;
42             }
43         }
44     }
45 }

引用:http://www.cnblogs.com/kkun/archive/2011/11/23/2260281.html

@chinazhoumin 提醒我说selectsort函数可以再简单一些,果然最后的那个if完全没用……

 1  void selection (int a[],int n)
 2  {
 3      int i,j,k,temp;
 4      for(i=0;i<n-1;i++)
 5      {
 6          k=i;//给记号赋值
 7          for(j=i+1;j<n;j++)
 8          {
 9              if (a[k]>a[j]);
10              {
11                 k=j;//使k总是指向最小元素
12                 temp=a[i];
13                 a[i]=a[k];
14                 a[k]=temp;
15              }
16          }
17      }
18  }

 


<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值