选择排序为什么是不稳定的?

选择排序是什么?:

选择排序(Selection sort):

是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法

可以将数组分为两个部分,有序和无序。刚开始有序为空。每次从无序的队列中选出最小(最大)的数放在有序的队尾。

如下图:
总共需要比较n-1

第一次选出5,放在第一个。
第二次选出8,放在有序的队尾。
······

在这里插入图片描述

为什么说选择排序是不稳定的呢?

稳定性:(来自百度百科)

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。

举个例子,序列arr = [5 8 5 2 9],我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定的。反之,就是非稳定的。

最后附上代码:

//比较n-1次
        for (int i = 0;i<arr.length-1;i++){
            //定义两个变量,一个用来存储最小值,一个用来存储最小值的索引
            //先将无序队列的第一个元素赋给这两个变量
            int minIndex = i;
            int min= arr[i];
            //比较无序队列的每个元素
            for (int j = i+1; j<arr.length;j++){
                if (min > arr[j]){
                    //将最小值赋给变量
                    minIndex = j ;
                    min =arr[j];
                }

            }
            //当循环遍历完成后,如果最小值的索引不是无序队列的第一个元素,就将其和最小值进行交换
            if (minIndex!=i){
                arr[minIndex] = arr[i];
                arr[i] = min;
            }
        }
  • 42
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 选择排序和冒泡排序都是排序算法,但选择排序的性能比冒泡排序更好。选择排序的时间复杂度为O(n^2),但它比冒泡排序更快,因为它每次只需要找到数组中的最小值,然后将其与数组的第一个元素交换,而不是冒泡排序需要不断交换相邻的元素。因此,选择排序在大型数据集中的性能更好。 ### 回答2: 选择排序比冒泡排序性能更好的原因有两个方面。首先,选择排序在每一次遍历中只进行一次交换,而冒泡排序在每一次遍历中可能进行多次交换。这样选择排序的交换次数要比冒泡排序少很多,减少了数据的移动次数,提高了排序的效率。 另外,选择排序每次遍历时会找到当前待排序数据中的最小值,并将其放在合适的位置上。这种策略使得选择排序的比较次数较少,因为每一次遍历只需要找到未排序部分的最小值即可。而冒泡排序需要不断比较相邻元素的大小,并进行交换,直到将最大的元素移到正确位置上。这样冒泡排序的比较次数较多,影响了排序的性能。 综上所述,选择排序通过减少数据的交换次数和比较次数,从而提高了排序的效率,因此性能比冒泡排序更好。但是需要注意的是,选择排序的时间复杂度仍然是O(n^2),在处理大规模数据时还是存在效率较低的问题,可以考虑其他更高效的排序算法。 ### 回答3: 选择排序比冒泡排序性能更好的原因有以下几点: 1. 比较次数较少:选择排序每次只需比较一次,而冒泡排序需要每次两两比较。因此,在平均情况下,选择排序的比较次数要比冒泡排序少。 2. 数据交换次数较少:选择排序每轮搜寻完后才进行交换,而冒泡排序在每次比较后就进行交换。因此,在平均情况下,选择排序的数据交换次数要比冒泡排序少。 3. 排序过程中的不稳定性:选择排序的过程中,如果发现当前元素不是最小的,则会立即进行交换,可能会导致相等元素的相对顺序发生变化,从而造成排序后的结果不稳定。而冒泡排序相邻两个相等元素不会发生交换,因此相对顺序保持不变,排序结果稳定。 综上所述,选择排序相对于冒泡排序具有更好的性能。然而,无论是选择排序还是冒泡排序,都是简单的排序算法,在处理大规模数据时都不是最优的选择,更高效的排序算法如快速排序、归并排序等可以获得更好的性能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vivien_o.O

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

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

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

打赏作者

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

抵扣说明:

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

余额充值