选择排序的基本思想是:每一趟从待排序的数据中找到最小值和待排序的第一个数交换位置;
选择排序是不稳定排序:例如数据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 }
浙公网安备 33010602011771号