【介绍】
要排序的一组数,选出最小,或者最大的一个数与第1个位置的数交换;然后在剩下的数当中再找最小,或者最大的与第2个位置的数交换。以此类推,直到第n-1个元素与第n个元素比较为止。
【分析】
第一趟,从n个记录中找出关键码最小的记录与第一个记录交换;
第二趟,从第二个记录开始的n-1个记录中再选出关键码最小的记录与第二个记录交换;
以此类推。。。
第i趟,则从第i个记录开始的n-i+1个记录中选出关键码最小的记录与第i个记录交换;
直到整个序列按关键码有序。
#include<iostream>
using namespace std;
void print(int a[], int n) {
for (int j = 0; j < n; j++) {
cout << a[j] << " ";
}
}
void selectSort(int a[], int n) {
for (int i = 0; i < n-1; ++i) {
int k = i;
int key = a[i];
for (int j = i + 1; j < n; ++j) {
if (key > a[j]) {
k = j;
key = a[j];
}
}
if (k != i) {
swap(a[i], a[k]);
}
}
return;
}
int main() {
int a[8] = { 3,1,5,7,2,4,9,6 };
cout << "begin:";
for (int j = 0; j < 8; j++) {
cout << a[j] << " ";
}
cout << endl;
selectSort(a, 8);
print(a, 8);
system("pause");
return 0;
}
【时间复杂度】
最坏情况为倒叙,每个数据都需要移一次,时间复杂度为O(n^2)
【空间复杂度】
O(1). 选择排序是不稳定的,如序列{4,4,3},第一次将第一个4与3交换,导致第一个4挪到第二个4后面