选择排序:简单高效的选择

news/2025/2/25 11:55:51

大家好,今天我们来聊聊选择排序(Selection Sort)算法。这是一个非常简单的排序算法,适合用来学习排序的基本思路和操作。选择排序在许多排序算法中以其直观和易于实现的特点著称,虽然它的效率不如其他高效算法(如快速排序和归并排序),但它仍然是学习和理解排序算法的一个很好的起点。

一、什么是选择排序?

选择排序是一种简单的排序算法,其基本思想是每次从未排序的部分中选出最小的元素,将它与未排序部分的第一个元素交换位置。这样,每一轮选择都会将一个最小元素放到数组的前面,直到整个数组排序完成。

选择排序的步骤:
  1. 从数组的第一个元素开始,假设当前元素为最小值。
  2. 从剩余的未排序部分中,找到最小的元素。
  3. 如果找到的最小元素小于当前元素,交换它们的位置。
  4. 将未排序部分的最小元素交换到当前元素的位置。
  5. 继续对剩余部分进行选择排序,直到整个数组有序。

二、选择排序的工作原理

假设我们有一个数组 [64, 34, 25, 12, 22, 11, 90],我们来演示一下选择排序的过程:

  1. 第一轮选择

    • 假设 64 是最小的元素,遍历数组的剩余部分,找到最小值 11,与 64 交换,得到 [11, 34, 25, 12, 22, 64, 90]
  2. 第二轮选择

    • 假设 34 是最小的元素,遍历剩余部分,找到最小值 12,与 34 交换,得到 [11, 12, 25, 34, 22, 64, 90]
  3. 第三轮选择

    • 假设 25 是最小的元素,遍历剩余部分,找到最小值 22,与 25 交换,得到 [11, 12, 22, 34, 25, 64, 90]
  4. 第四轮选择

    • 假设 34 是最小的元素,遍历剩余部分,找到最小值 25,与 34 交换,得到 [11, 12, 22, 25, 34, 64, 90]
  5. 第五轮选择

    • 假设 34 是最小的元素,遍历剩余部分,找到最小值 34,不需要交换,得到 [11, 12, 22, 25, 34, 64, 90]
  6. 第六轮选择

    • 假设 64 是最小的元素,遍历剩余部分,找到最小值 64,不需要交换,得到 [11, 12, 22, 25, 34, 64, 90]
  7. 第七轮选择

    • 最后剩下的元素是 90,它已经排到最后,不需要交换。

最终排序后的数组为 [11, 12, 22, 25, 34, 64, 90]

三、选择排序的时间复杂度

选择排序的时间复杂度是 O(n²),其中 n 是数组的元素数量。原因如下:

  • 每一轮需要遍历未排序部分的所有元素,找到最小的元素并交换它。第一轮遍历需要 n-1 次比较,第二轮需要 n-2 次比较,依此类推,总共需要 n(n-1)/2 次比较。
  • 由于这是一种双重循环结构,因此其时间复杂度为 O(n²)
最好情况:
  • 即使数组已经有序,选择排序仍然会进行完整的遍历,时间复杂度仍然是 O(n²)
最坏情况:
  • 当数组是逆序时,选择排序依然需要进行完整的遍历,时间复杂度为 O(n²)

四、选择排序的空间复杂度

选择排序是原地排序算法,它只需要常数级的额外空间来存储临时变量(用于交换元素)。因此,它的空间复杂度为 O(1)

下面是一个用 Java 实现的选择排序代码:

public static void selectsort(int[] arr) {
        int index = 0;
        int max = arr[index];
        for (int j = 0; j < arr.length - 1; j++) {
            //循环一次选择一个最大值
            for (int i = 1; i < arr.length - j; i++) {
                index = arr[i] > max ? i : index;
                max = arr[index];
            }
            //交换最大值与未排序元素的最后一个
            swap(arr, index, arr.length - j - 1);
            //注意重置最大值与索引
            index = 0;
            max = arr[index];
        }
    }
    public static void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

输入数组 {64, 34, 25, 12, 22, 11, 90},程序的输出是:

11 12 22 25 34 64 90


http://www.niftyadmin.cn/n/5865466.html

相关文章

在arm64设备(树莓派4B)上部署Hyperledger Fabric V2.5

arm64设备相较于x86设备功耗低、硬件成本低,树莓派4B是一个流行的arm64设备,本文记录在树莓派4B中部署Hyperledger Fabric V2.5的关键点,即与x86架构启动网络所需材料的差异。 成功部署示例 如图所示,Hyperledger Fabric V2.5.6 成功运行在了树莓派4B(8G内存版)中,即te…

奇异值分解(SVD)拟合平面

奇异值分解&#xff08;SVD&#xff09;拟合平面 在三维空间中&#xff0c;使用奇异值分解&#xff08;SVD&#xff09;来拟合平面是一种常见且有效的方法。下面将详细介绍其原理、实现步骤&#xff0c;并给出Python代码示例。 原理 给定一组三维空间中的点 P { p 1 , p 2…

【无标题】PHP-get_definde_vars

[题目信息]&#xff1a; 题目名称题目难度PHP-get_defined_vars2 [题目考点]&#xff1a; get_defined_vars — 返回由所有已定义变量所组成的数组此函数返回一个包含所有已定义变量列表的多维数组&#xff0c;这些变量包括环境变量、服务器变量和用户定义的变量。 [Flag格式…

DeepSeek-R1:通过强化学习激发大语言模型的推理能力

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列三DeepSeek大模型技术系列三》DeepSeek-…

如何解决 MySQL 数据库服务器 CPU 飙升的情况

大家好&#xff0c;我是 V 哥。当 MySQL 数据库服务器 CPU 飙升时&#xff0c;我们应该怎么办&#xff1f;从何入手解决问题&#xff0c;有没有什么套路&#xff0c;因为自古真情留不住&#xff0c;唯有套路得人心&#xff0c;虽然这是一句玩笑话&#xff0c;也算很贴切&#x…

【算法与数据结构】Dijkstra算法求单源最短路径问题

目录 Dijkstra算法 算法简介&#xff1a; 该算法的核心思想&#xff1a; 算法特点&#xff1a; 算法示例演示&#xff1a; 算法实现&#xff1a; 邻接矩阵存图 邻接表存图&#xff1a; 时间复杂度分析&#xff1a; Dijkstra算法 算法简介&#xff1a; Dijkstra算法&am…

蓝桥云课python代码

第一章语言基础 第一节编程基础 1 python开发环境 第一个Python程序 # 打印"Hello World" print("Hello World")# 打印2的100次方 print(2 ** 100)# 打印112 print("11",1 1)""" Hello World 126765060022822940149670320537…

Spring 源码硬核解析系列专题(一):IoC 容器的初始化过程

Spring 框架作为 Java 生态中最经典的开源项目之一,其核心魅力在于 IoC(控制反转)和 DI(依赖注入)的优雅实现。本系列将深入 Spring 源码,带你从零到一解剖其底层逻辑。本篇作为开篇,我们将聚焦 IoC 容器的初始化过程,以 ClassPathXmlApplicationContext 为例,逐步揭开…