深入浅出排序算法之简单选择排序

目录

[1. 原理和执行流程](#1. 原理和执行流程)

[2. 代码实现](#2. 代码实现)

[3. 性能分析](#3. 性能分析)

[4. 双向选择排序(了解)](#4. 双向选择排序(了解))


1. 原理和执行流程

选择排序包含了堆排序和简单选择排序。

每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完 。

选择类排序的主要动作是"选择",简单选择排序采用最简单的选择方式,从头至尾顺序扫描序列。找出最小的一个关键字,和第一个关键字交换,接着从剩下的关键字中继续这种选择和交换,最终使序列有序。

2. 代码实现

java 复制代码
    //选择排序
    public static void selectSort(int[] array){
        for(int i = 0;i < array.length - 1;i++){
            //剩下最后一个元素,不需要选择了,因为已经在最合适的位置
            boolean flag = false;//用来比较是否更好minIndex的值
            int j = i + 1;//往后一位进行比较
            int minIndex = i;
            for(;j < array.length;j++){
                if(array[minIndex] > array[j]){
                    minIndex = j;
                    flag = true;
                }
            }
            if(flag){
                int tmp = array[minIndex];
                array[minIndex] = array[i];
                array[i] = tmp;
            }
        }
    }


    public static void main(String[] args) {
        int[] arr = {3,1,2,4,5};
        Sort.selectSort(arr);
        for (int x : arr) {
            System.out.print(x + " ");
        }
    }

3. 性能分析

|-----------|-----------|
| 时间复杂度 | 空间复杂度 |
| O(N^2) | O(1) |
| 数据不敏感 | 数据不敏感 |

4. 双向选择排序(了解)

每一次从无序区间选出最小 + 最大的元素,存放在无序区间的最前和最后,直到全部待排序的数据元素排完 。

java 复制代码
    public static void main(String[] args) {
        int[] arr = {5,2,1,3,4};
        Sort.selectSortOP(arr);
        for (int x : arr) {
            System.out.print(x + " ");
        }
    }

    //双向选择排序
    //和单向的时间复杂度一致,可能只是更帅一点吧
    public static void selectSortOP(int[] array){
        int low = 0;
        int high = array.length - 1;
        // [low, high] 表示整个无序区间
        // 无序区间内只有一个数也可以停止排序了
        while(low < high){
            int min = low;
            int max = low;
            for(int i = low + 1;i <= high;i++){
                if (array[i] < array[min]) {
                    min = i;
                }
                if(array[i] > array[max]){
                    max = i;
                }
            }
            swap(array,low,min);
            //见下面解析:最大值可能在low的位置上,min和low一交换,最大值就到了min的位置
            if(max == low){
                max = min;
            }
            swap(array,high,max);
            low++;
            high--;
        }
    }
java 复制代码
array = { 9, 5, 2, 7, 3, 6, 8 }; // 交换之前
// low = 0; high = 6
// max = 0; min = 2
array = { 2, 5, 9, 7, 3, 6, 8 }; // 将最小的交换到无序区间的最开始后
// max = 0,但实际上最大的数已经不在 0 位置,而是被交换到 min 即 2 位置了
// 所以需要让 max = min 即 max = 2
array = { 2, 5, 8, 7, 3, 6, 9 }; // 将最大的交换到无序区间的最结尾后
相关推荐
Coovally AI模型快速验证5 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun5 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao346 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng11336 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
啊阿狸不会拉杆7 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路7 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
你知道网上冲浪吗8 小时前
【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架
python·算法·数学建模·数值分析
地平线开发者9 小时前
征程 6 | PTQ 精度调优辅助代码,总有你用得上的
算法·自动驾驶
Tisfy10 小时前
LeetCode 837.新 21 点:动态规划+滑动窗口
数学·算法·leetcode·动态规划·dp·滑动窗口·概率
CoovallyAIHub10 小时前
为高空安全上双保险!无人机AI护航,YOLOv5秒判安全带,守护施工生命线
深度学习·算法·计算机视觉