选择排序

【1】选择排序理论

(1)基本概念

选择排序的时间复杂度为O(n*n)。(参见《算法复杂度》)

选择排序是不稳定的排序方法(参见《常用排序算法稳定性分析》)。

选择排序最大的优点是赋值的次数少,这个是其它算法无法比拟的。

(2)排序逻辑

每一趟从待排序的数据元素中选出最小(或最大)的一个元素;

顺序放在已排好序的数列的最后;

直到全部待排序的数据元素排完。

【2】选择排序过程

示例如下:

初始关键字    [49 38 65 97 76 13 27 49]

第一趟排序后 13  [38 65 97 76 49 27 49]

第二趟排序后 13 27 [65 97 76 49 38 49]  

第三趟排序后 13 27 38  [97 76 49 65 49]

第四趟排序后 13 27 38 49  [76 97 65 49 ]  

第五趟排序后 13 27 38 49 49  [97 65 76]

第六趟排序后 13 27 38 49 49 65  [97 76]

第七趟排序后 13 27 38 49 49 65 76  [97]

最后排序结果 13 27 38 49 49 65 76  97

【3】C++实现选择排序

示例代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 #define   MAXSIZE     12
 5 #define   SWAP(x,y)   {int t; t=x; x=y; y=t;}
 6 
 7 void ShowArray(int br[])
 8 {
 9     for(int i = 0; i < MAXSIZE; ++i)
10     {
11         cout<<br[i]<<"  ";
12     }
13     cout<<endl;
14 }
15 
16 void SelectSort(int br[],int n)
17 {
18     for(int i = 0; i < n; ++i)
19     {
20         int k = i;
21         for(int j = i + 1; j < n; ++j)
22         {
23             if(br[k] > br[j])
24             {
25                 k = j;
26             }
27         }
28         if(k != i)    //比较完后发现还是"自己"最小 即k == i就没有必要再执行交换
29         {
30             SWAP(br[k], br[i]);
31         }
32     }
33 }
34 
35 void main()
36 {
37     int ar[MAXSIZE] = {23,34,45,78,90,12,49,92,32,19,46,8};
38     ShowArray(ar);
39     SelectSort(ar,MAXSIZE);
40     ShowArray(ar);
41 }
42 
43 /*
44 23  34  45  78  90  12  49  92  32  19  46  8
45 8  12  19  23  32  34  45  46  49  78  90  92
46  */

 【4】选择排序到底是稳定还是不稳定排序?

举个例子:序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了。

所以,选择排序不是一个稳定的排序算法。

 

Good Good Study, Day Day Up.

顺序  选择  循环  坚持  总结

posted @ 2013-01-09 11:25  kaizenly  阅读(686)  评论(0编辑  收藏  举报
打赏