选择排序及其优化(Selection sort)

2 篇文章 0 订阅

        上次讲了冒泡排序及其优化,可以发现每一次排序的是时候都要交换元素位置好几次,虽然算法稳定,但是频繁交换元素消耗系统资源,性能并不是很佳。是不是还有比冒泡排序快的排序方法呢?当然有,还不止一种,本节将谈到其中一种---》选择排序。

        选择排序的思想:每一次排序找出最小的(或者最大的)元素与此次参与排序的第一个(或者最后一个)元素交换位置,直至排序成功。以找正序排序为例:每次寻找只需要比较找出小大元素的索引,然后再跟此次参与排序的第一个元素交换位置,每次排序只交换一次位置,这样避免了冒泡排序大量交换元素位置的缺点。

       举例:   5,4,3,2,1

       第一次排序:  1,4,3,2,5

       第二次排序:  1,2,3,4,5           -----》已正序,虽然已经正序,但是根据选择排序的特性,无法判断是否已经正序,所以还得继续往下循环(只循环判断,不用交换元素位置) ---》虽然无效的循环判断浪费了一点性能,但是综合来讲比冒泡排序快

      优化后代码如下:(正序)

    public void selectionSort(int[] sort) {
        int temp;
        for (int i=0;i<sort.length-1;i++) {
            int minSize = i;
            for(int j=i+1;j<sort.length;j++) {
                if(sort[minSize]>sort[j]) {
                    minSize = j;
                }
            }
            if(minSize != i) {
                temp = sort[i];
                sort[i] = sort[minSize];
                sort[minSize] = temp;
            }
        }
    }

        虽然优化后选择排序是比优化后冒泡排序快点,但是它的缺点是算法不稳定,比如:5,2,5,1,6   第一次交换时第一个5挪到了第二个5后面了,相同项在排序后的次序被变化了,所以算法时不稳定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值