选择排序及其复杂度

什么是选择排序

选择排序是通过不断地从元素中选出最小的元素放在它应该所处的位置上。例如第i次选出的元素应该位于数组的Array[i]处,如果不是,则将其与之交换位置,i从0开始计数。
也就是说,不断地从无序区域选择出最小的元素,放在无序区域的头部,也就是有序区域的末尾,这个元素是当前无序区域的最小元素,同时是有序区域的最大元素,本次选择过后,它成为有序区域的最后一个元素。不断地重复这个过程,直至所有元素都处在正确的位置上。初始状态下,整个数组是无序区域,有序区域为空集。

选择排序的工作机制

以数组[20,12,10,15,2]为例,看一下选择排序的工作机制。

第0轮选择
  1. 将第一个元素Array[0]当作最小的元素min

    将第一个元素当作最小元素min
  2. 比较min与第二个元素Array[1]的大小,如果Array[1]小于min,则将Array[1]赋值给min,否则什么都不做。以此类推,直到比较完min与最后一个元素Array[n-1]的大小。

    比较min与剩余元素的大小
  3. 一轮选择下来,最小元素min放在了无序区域的头部Array[0],它成为有序区域的尾部。

    交换minArray[0]的位置
以此类推,整个的选择过程如下
第0轮选择
第1轮选择
第2轮选择
第3轮选择

伪代码

selectionSort(array, size)
  repeat (size - 1) times
  set the first unsorted element as the minimum
  for each of the unsorted elements
    if element < currentMinimum
      set element as new minimum
  swap minimum with first unsorted position
end selectionSort

java实现

void selectionSort(int[] numbers) {
    //检查入参,如果numbers为null或size < 2,则无需排序
    if (numbers == null || numbers.length < 2) {
        return;
    }
    //每一轮都是将无序区域[round-numbers.length-1]中最小的元素选出并放至numbers[round]位置
    for (int round = 0; round < numbers.length - 1; round++) {
        //保存最小元素的索引
        int minIndex = round;
        for (int index = round + 1; index < numbers.length; index++) {
            //如果index处的元素小于minIndex处的值,则将其赋值给minIndex
            if (numbers[index] < numbers[minIndex]) {
                minIndex = index;
            }
        }
        // 如果当前一轮选择的最小元素不在它应处的位置(numbers[round]),则交换它们
        if (round != minIndex) {
            int temp = numbers[minIndex];
            numbers[round] = numbers[minIndex];
            numbers[minIndex] = temp;
        }
    }
}

复杂度及稳定性

时间复杂度空间复杂度稳定性
最好 O ( n 2 ) O(n^2) O(n2)最差 O ( n 2 ) O(n^2) O(n2)平均 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)不稳定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vincent(朱志强)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值