排序算法(五):选择排序

排序思路:
找到当前数组中最小元素,放在数组首位,然后刨去首位,在剩下的待排序元素中查找最小元素,放于首位后面。如此往复,将每次查找到的最小元素逐个按序放在数组最前端,直到排序完成。
举例:

{22,35,16,9,5,20} 

1)我们设a[0]为初始最小值,把其与其后的元素一起比较,找出最小值5。交换22与5。

{5,35,16,9,22,20} 

2)现在5已经排好了。继续把观察点向后移动,将初始最小值定为35,把其与其后的元素一起比较,找出最小值9,交换35与9。

{5,9,16,35,22,20} 

3)重复上述步骤:

{5,9,16,35,22,20}  (观察点a[2],不换)
{5,9,16,20,22,35}  (观察点a[3],35<->20)
{5,9,16,20,22,35}  (观察点a[4],不换)
{5,9,16,20,22,35}  (观察点a[5],不换) 

4)结果:

{5,9,16,20,22,35} 

c实现:

void selectSort(int array[], int len){
    int tmp,min_val,index_of_min;
    int i=0;
    for(; i<len; i++){
        tmp = array[i];//把首位先空出来,用于存放每一轮比较出的最小值
        int j=i;//每一轮比较的起始点
        min_val = array[i];//设最小值为每轮的第一个值
        index_of_min = j;//记录最小值的索引
        for(; j<len; j++){
            if(array[j]<min_val){
                //找到小于当前最小值的元素,更新最小值并记录索引
                min_val = array[j];
                index_of_min = j;
            }
        }
        //本轮结束,将最小值与首位交换
        array[i]=min_val;
        array[index_of_min]=tmp;
    }
}

时间复杂度为O(n2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值