简单选择排序

原创
2013/06/10 16:36
阅读数 265

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 稳定性:关于简单排序的稳定性,有一定的争议,一般认为是不稳定的。但是上面的代码,明显是稳定的。要是遇到笔试题,还是选择不稳定吧。

展开阅读全文
加载中
点击加入讨论🔥(4) 发布并加入讨论🔥
打赏
4 评论
1 收藏
1
分享
返回顶部
顶部