选择排序的基本思想是:每一趟从待排序的数据中找到最小值和待排序的第一个数交换位置;

选择排序是不稳定排序:例如数据4 3 4 1,第一趟排序就会把第一个4放在末位了。

选择排序的具体流程如下:

初始数据: [7   6   3   1   2   4   5]

第一趟:    1   [6   3   7   2   4   5]

第二趟:    1   2   [3   7   6   4   5]

第三趟:    1   2   3   [7   6   4   5]

第四趟:    1   2   3   4   [6   7   5]

第五趟:    1   2   3   4   5   [7   6]

第六趟:    1   2   3   4   5   6   [7]

最后结果:1   2   3   4   5   6   7

时间复杂度:选择排序的交换操作介于 0 和 (n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。

选择排序代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 int a[10001]={};
 4 int main(){
 5     int n;
 6     cin >> n;  //输入要排序数据的个数 
 7     //输入n个整数 
 8     for(int i=0;i<n;i++){
 9         cin >> a[i];
10     }
11     int k;  //k用来记录最小数的下标 
12     for(int i=0;i<n;i++){
13         k = i;
14         for(int j=i+1;j<n;j++){
15             if(a[j]<a[k]){
16                 k=j;
17             }
18         }     
19         swap(a[i],a[k]);        
20     }
21     for(int i=0;i<n;i++){
22         cout << a[i] << " ";
23     } 
24     return 0;
25 }

 

posted on 2018-07-02 17:28  Hankercat  阅读(129)  评论(0)    收藏  举报