排序算法系列-选择之直接选择

前言

通过最近的几次讲课,越来越发现了算法的重要性,冒泡,选择,插入是三种基础排序,打好基础,以便追求更高深的知识。


直接选择排序

基本思想:在第i次选择操作中,通过n-i次比较,从n-i+1个记录中选出键值最小的记录,并和地i(1<=i<=n-1)个记录交换。

可以这样理解:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。


运行过程

第一趟,假定第一个元素最小,用a(min)标记,然后和下一个元素比较,如果下一下元素小于第一个,就将标记a(min)从第一个移到下一个,然后依次和带有下标的元素比较,最后从n 个记录中找出关键码最小的记录与第一个记录交换;

第二趟,从第二个记录开始,重复上一步的步骤,从n-1 个记录中再选出关键码最小的记录与第二个记录交换;

以此类推.....

第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,直到整个序列按关键码有序。


示例


算法实现(核心代码)

public void selectionSort(int[] list)
{
    // 需要遍历获得最小值的次数
    // 要注意一点,当要排序 N 个数,已经经过 N-1 次遍历后,已经是有序数列
    for (int i = 0; i < list.length - 1; i++) 
    {
        int temp = 0;
        int min = i; // 用来保存最小值得索引
 
        // 寻找第i个小的数值
        for (int j = i + 1; j < list.length; j++) 
        {
            if (list[min] > list[j]) 
            {
                min = j;
            }
        }
        // 将找到的第i个小的数值放在第i个位置上
        temp = list[min];
        list[min] = list[i];
        list[i] = temp;
 
    }
}

算法分析

平均时间复杂度:O(n2)

空间复杂度:O(1) ,简单选择排序需要占用 1 个临时空间,在交换数值时使用。

稳定性:不稳定 (比如序列【5, 5, 3】第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)


评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子松的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值