1 排序思想:
第1趟:从第0个到第(n-1)个记录中选择关键字最小的记录,与第0个记录交换
第2趟:从第1个到第(n-1)个记录中选择关键字最小的记录,与第1个记录交换
……
第i趟:从第(i-1)和到第(n-1)个记录中选择关键字最小的记录,与第(i-1)个记录交换
……
直到第(n-1)趟,在最后两个记录中选择关键字最小的,与第(n-2)个记录交换
2 算法实现:
// 选择排序
void select_sort(int num[], int n){
int i,j,min_index,tmp;
// 要进行n-1趟排序
for(i=0;i<n-1;i++){
// min_index为这一趟关键字最小的记录的下标
min_index=i;
// 从num[j,n-1]中找到关键字最小的
for(j=i+1;j<n;j++){
if(num[min_index]>num[j])
min_index=j;
}
// 交换
if(min_index!=i){
tmp=num[min_index];
num[min_index]=num[i];
num[i]=tmp;
}
}
}
3 性能分析:
3.1 空间复杂度:如上代码,仅在交换数据时使用一个辅助空间,空间复杂度是O(1)
3.2 时间复杂度:不论原始记录如何,每一趟要进行的比较操作都是确定的。以上面代码为例,第i趟排序,需要比较(n-i-1)次(从i+1到n-1),整个排序过程的比较次数为
记录移动的次数,最小是0次,最多是3(n-1)次。
因而简单排序算法的最好、最差和平均时间复杂度都是O(n^2)
3.3 稳定性:关于简单排序的稳定性,有一定的争议,一般认为是不稳定的。但是上面的代码,明显是稳定的。要是遇到笔试题,还是选择不稳定吧。