选择排序
【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.
顺序 选择 循环 坚持 总结