Skip to content

本模块是公共类课程,适合绝大部分计算机岗位。由于 Java 受众最广且易读性强,本模块示例代码使用 Java 编写,其他语言也可参考学习。

选择排序原理

选择排序是一种简单的排序算法,主要思想是每次从未排序的元素中选择最小或最大的元素,放到已排序的末尾。

选择排序的时间复杂度是 O(n^2),空间复杂度是 O(1)。

选择排序实现

如,对数组arr = [5, 3, 8, 6, 4]进行升序选择排序。

先让指针i指向数组第 0 个元素,表示未排序的第 0 个元素,每经过一轮选择,i++

每一轮让指针minIndex指向i,然后依次比较,找到最小的元素的索引,最后和i指向的元素交换位置。

排序过程如下:

  1. 第一轮

    53864
    minj

    arr[min] > arr[j],改变指针指向

    53864
    iminj

    arr[min] < arr[j],不改变指针指向

    53864
    iminj

    arr[min] < arr[j],不改变指针指向

    53864
    iminj

    arr[min] < arr[j],不改变指针指向,此时j位于数组末尾,开始交换位置

    35864
  2. 第二轮

    35864
    minj

    arr[min] < arr[j],不改变指针指向

    35864
    minj

    arr[min] < arr[j],不改变指针指向

    35864
    minj

    arr[min] > arr[j],改变指针指向,此时j位于数组末尾,开始交换位置

    34865
  3. 第三轮

    34865
    minj

    arr[min] > arr[j],改变指针指向

    34865
    iminj

    arr[min] > arr[j],改变指针指向,此时j位于数组末尾,开始交换位置

    34568
  4. 第四轮

    34568
    minj

    arr[min] < arr[j],不改变指针指向,此时j位于数组末尾,开始交换位置

    循环结束后,i指向数组末尾,排序完成。

选择排序代码实现

java
public void selectionSort(int[] nums) {
    int n = nums.length;
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (nums[j] < nums[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex != i) {
            int temp = nums[i];
            nums[i] = nums[minIndex];
            nums[minIndex] = temp;
        }
    }
}