【选择排序】十大排序算法之选择排序

【选择排序】十大排序算法之选择排序,属于不稳定的排序。

目录

一、选择排序思想介绍

二、选择排序代码实现


一、选择排序思想介绍

  • 选择排序,是【选择类】排序。
  • 选择排序,是【不稳定】的排序。
  • 时间复杂度:O(n^2)。

什么是稳定的排序???

稳定排序:

  • 如果排序数组中,存在相同的元素,假设存在两个元素【3】。
  • 为了标识两个元素【3】的先后顺序,我们假设给她命名为:【3(1)】、【3(2)】。
  • 其中括号里面的表示元素3出现的先后顺序。
  • 如果结果排序之后,两个元素还是保持相同的顺序,即:【3(1)、3(2)】,那么我们就称这个排序是稳定的,否则就是不稳定的排序。

选择排序基本思想

选择排序,关键在于选择,每次从待排序的元素中选最小的那个元素,然后将其放到已排序元素末尾,这样直到没有待排序元素为止,此时排序完成。

选择排序具体思路:

  1. 第一次从待排序数组中,找到最小元素所在下标。
  2. 然后将最小元素所在位置和数组第一个元素位置交换。
  3. 此时,第一个位置就是整个数组最小元素,并且是有序的。
  4. 然后,从第二个元素位置开始,继续选择最小元素所在下标。
  5. 重复,1,2,3步骤,直到没有元素可选择位置。

选择排序,大致流程如图所示:

【选择排序】十大排序算法之选择排序_第1张图片

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

前面说了选择排序的步骤,假设我们有一组数组:【5(1),8,5(2),2,9】(括号里面的数字表示出现的先后顺序)。

当我们第一次进行选择排序后,第一个数字【5】会和数字【2】交换位置,此时变成:【2,8,5(2),5(1),9】,可以看到,此时就已经破坏了两个相同元素的先后顺序了,所以选择排序是不稳定的排序。

可以从这个网站查看选择排序的过程【数据结构和算法动态可视化 (Chinese) - VisuAlgo】。

二、选择排序代码实现

算法具体实现思路:

  • 外层循环,用于控制选择排序的次数(【n】个元素需要进行【n-1】次选择排序)。
  • 内层循环,用于找出最小元素的位置(每次找出【i】到【len】之间的最小元素位置【min】)。
  • 然后交换【i】和【min】两个位置的元素。
  • 直到循环结束,选择排序结束。
public class SelectionSort {
    /** 选择排序: O(n^2) */
    public static void selectionSort(int[] nums) {
        for (int i = 0; i < nums.length - 1; i++) {
            // 设置当前最小下标
            int minIndex = i;
            // 从 i 到 len 之间找出最小元素位置
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] < nums[minIndex]) {
                    minIndex = j; // 更新最小下标位置
                }
            }
            // 交换 i 和 minIndex 位置元素
            int temp = nums[i];
            nums[i] = nums[minIndex];
            nums[minIndex] = temp;
        }
    }
    public static void main(String[] args) {
        int[] nums = {3, 1, 5, 2, 4};
        System.out.println(Arrays.toString(nums));
        selectionSort(nums);
        System.out.println(Arrays.toString(nums));
    }
}

综上,就是选择排序相关思想,以及代码实现。

你可能感兴趣的:(刷题算法笔记,排序算法,算法,选择排序)