概述

在要排序的一组数中,选出最小的一个数与第1个位置的数交换;然后在剩下的数当中再找最小的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

换句话说:

i 代表当前需要排序的序号,则需要在剩余的 [i... n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每一趟确定元素的过程中都会有一个选择最大值的子流程,所以人们形象地称之为选择排序。选择排序的时间复杂度和空间复杂度分别为 O(n2)O(1)

直观释义图:

步骤

  1. n 个记录中找出关键码最小的记录与第一个记录交换

  2. 从第2 个记录开始的 n-1 个记录中再选出最小的记录与第2 个记录交换

  3. 从第i (i是不断+1的)个记录开始的 n-i+1 个记录中选出最小的与第i 个记录交换

  4. 直到整个序列有序

实例

原始数据:

3 5 2 6 2

第一轮,找出 [5 2 6 2] 中最小的第三个位置 2 ,与第一个位置 3 进行交换

2 5 3 6 2

第二轮,找出 [3 6 2] 中最小的 2 与第一轮中第二个位置 5 进行交换

2 2 3 6 5

第三轮,找出 [6 5] 中最小的 5 与第二轮中第三个位置 3 不需交换

2 2 3 6 5

第四轮,找出 [5] 中最小的 5 与第三轮中的第四个位置 6 进行交换

2 2 3 5 6

第五轮,没有了,最终结果

2 2 3 5 6

简单选择排序也可以认为是稳定的排序。

代码实现(Java)

package com.coder4j.main.arithmetic.sorting;
    
public class SimpleSelection {

    /**
     * 简单选择排序
     * 
     * @param array
     * @return
     */
    public static int[] sort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.println("第" + (i + 1) + "轮比较结果:");
            int minPosition = i;
            // 找出i之后的数组中的最小索引
            for (int j = i + 1; j < array.length; j++) {
                if (array[j] < array[minPosition]) {
                    minPosition = j;
                }
            }
            // 判断是否需要调换位置
            if (array[i] > array[minPosition]) {
                int temp = array[i];
                array[i] = array[minPosition];
                array[minPosition] = temp;
            }
            // 输出此轮排序结果
            for (int k : array) {
                System.out.print(k + " ");
            }
            System.out.println();
        }
        return array;
    }

    public static void main(String[] args) {
        int[] array = { 3, 5, 2, 6, 2 };
        int[] sorted = sort(array);
        System.out.println("最终结果");
        for (int i : sorted) {
            System.out.print(i + " ");
        }
    }
}

测试输出结果:

第1轮比较结果:
2 5 3 6 2 
第2轮比较结果:
2 2 3 6 5 
第3轮比较结果:
2 2 3 6 5 
第4轮比较结果:
2 2 3 5 6 
第5轮比较结果:
2 2 3 5 6 
最终结果
2 2 3 5 6 

经测试,与实例中结果一致。


Chinaxiang
2.1k 声望52 粉丝

这个人很懒,什么也没有留下。


« 上一篇
希尔排序
下一篇 »
快速排序