算法熟记-排序系列-选择排序
1. 简述
假设待排序数组为 int array[], 数组长度为n。
第1趟排序,从array[0]-array[n-1]中,选择最小的元素,如果该元素不是array[0],则与其交换。
第2趟排序,从array[1]-array[n-1]中,选择最小的元素,如果该元素不是array[1],则与其交换。
···
第n-1趟排序,从array[n-2]-array[n-1]中,选择最小的元素,如果该元素不是array[n-2],则与其交换。
2. 复杂度
交换的次数介于[0,n-1],但是比较的次数是(n+1)*n/2左右。最好、最坏和平均的比较次数都是固定的,因此时间复杂度是O(n^2)。交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
稳定性上,属于不稳定的排序。例如:5 8 5 2 9,第一次会把5和2交换,这样前面的5就会换到后面去了。
3. 代码
void selection_sort(int array[], int n) {
int pos;
for(int i=0; i<n-1; i++) {
pos = i;
for(int j=i+1; j<n; j++) {
if(array[j] < array[pos]) {
pos = j;
}
}
if(pos == i) continue;
swap(array[pos], array[i]);
}
}
int pos;
for(int i=0; i<n-1; i++) {
pos = i;
for(int j=i+1; j<n; j++) {
if(array[j] < array[pos]) {
pos = j;
}
}
if(pos == i) continue;
swap(array[pos], array[i]);
}
}
4. 参考资料