选择排序及其复杂度

Posted Vincent(朱志强)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择排序及其复杂度相关的知识,希望对你有一定的参考价值。

选择排序

什么是选择排序

选择排序是通过不断地从元素中选出最小的元素放在它应该所处的位置上。例如第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)不稳定

以上是关于选择排序及其复杂度的主要内容,如果未能解决你的问题,请参考以下文章

选择排序及其复杂度

选择排序的具体实现及其原理

选择排序及其复杂度

十大经典排序--选择排序及其优化

JavaScript实现选择排序及其优化

我终于弄懂选择排序(堆排序)