一 概述
选择排序的基本思想是:每趟(如第i趟)在后面n-i+1(i = 1,2,...,n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到第n-1躺做完,待排序元素只剩下一个,就不用再选了。选择排序中有简单选择排序和堆排序。
二 简单选择排序
假设排序表为L[1..n] ,第i趟排序即从L[i ... n]中选择关键字最小的元素与L[i]交换,每一趟排序可以确定一个元素的最终位置,经历过n-1趟排序就可使得整个排序表有序。
三 代码实现
#include<stdio.h>
void SelectSort(int a[], int n) {
int i,j,temp,min;
for(i=0;i<n-1;i++) {
min = i;
for(j=i+1;j<n;j++)
if(a[j] < a[min]) min = j;
if(min!=i){
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
}
int main() {
int b[] = {49,38,65,97,76,13,27,49};
SelectSort(b,8);
for(int i = 0; i < 8; i++) {
printf("%d ",b[i]);
}
return 0;
}
代码结果:
四 算法效率
算法 | 最好时间 | 最坏时间 | 平均时间 | 额外空间/空间复杂度 | 稳定性 |
---|---|---|---|---|---|
简单选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
空间效率:适用常数辅助单元,所以空间效率为O(1);
时间效率:在简单选择排序过程中,元素移动的操作次数很少,不会超过3(n-1)次,最好的情况是移动0次,此时对应的表已经有序;但元素间比较的次数与序列的初始状态无关,始终是n(n-1)/2,因此时间复杂度始终是O(n^2);
稳定性:在第i趟找到最小元素后,和第i个元素交换,可能会导致第i个元素与其含有相同关键字元素的相对位置发生改变。如L = {2,2,1},经过第一趟排序后L= {1,2,2} ,由此可知,简单选择排序是一种不稳定的排序方法。