排序算法之选择排序详细解读(附带Java代码解读)

2024-08-27 05:44

本文主要是介绍排序算法之选择排序详细解读(附带Java代码解读),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

选择排序(Selection Sort)是一种简单且直观的排序算法。它的基本思想是:每一轮从未排序的部分中选出最小(或最大)的元素,放到已排序部分的末尾。通过不断地选择最小(或最大)元素,最终使整个数组有序。

算法思想

  1. 初始化:将数组分为已排序部分和未排序部分。开始时,已排序部分为空,未排序部分是整个数组。
  2. 选择最小元素:在未排序部分中找到最小的元素,并将其与未排序部分的第一个元素交换。这样,最小元素就被放到了已排序部分的末尾。
  3. 重复步骤2:不断重复上述过程,直到未排序部分为空。此时,整个数组已经有序。

过程示例

假设有一个待排序的数组:[64, 25, 12, 22, 11]

初始状态:

数组:[64, 25, 12, 22, 11]

第1轮选择:
  1. 在未排序部分 [64, 25, 12, 22, 11] 中,找到最小的元素 11。
  2. 将 11 和未排序部分的第一个元素 64 交换。
  3. 数组变为:[11, 25, 12, 22, 64],其中 [11] 是已排序部分,[25, 12, 22, 64] 是未排序部分。
第2轮选择:
  1. 在未排序部分 [25, 12, 22, 64] 中,找到最小的元素 12。
  2. 将 12 和未排序部分的第一个元素 25 交换。
  3. 数组变为:[11, 12, 25, 22, 64],其中 [11, 12] 是已排序部分,[25, 22, 64] 是未排序部分。
第3轮选择:
  1. 在未排序部分 [25, 22, 64] 中,找到最小的元素 22。
  2. 将 22 和未排序部分的第一个元素 25 交换。
  3. 数组变为:[11, 12, 22, 25, 64],其中 [11, 12, 22] 是已排序部分,[25, 64] 是未排序部分。
第4轮选择:
  1. 在未排序部分 [25, 64] 中,找到最小的元素 25。
  2. 将 25 和未排序部分的第一个元素 25 交换(自身交换,数组不变)。
  3. 数组变为:[11, 12, 22, 25, 64],其中 [11, 12, 22, 25] 是已排序部分,[64] 是未排序部分。
第5轮选择:
  1. 最后一轮只有一个元素 64,已是最小,不需要交换。
  2. 数组最终变为:[11, 12, 22, 25, 64]。

经过上述5轮选择,数组已经完全有序。

算法复杂度

  • 时间复杂度:

    • 最坏情况: O(n^2)
    • 平均情况: O(n^2)
    • 最佳情况: O(n^2)

    选择排序在最优、最坏、和平均情况下的时间复杂度都是 O(n^2),因为无论数组是否已排序,算法都要遍历整个未排序部分来寻找最小元素。

  • 空间复杂度: O(1) 选择排序是原地排序算法,不需要额外的存储空间,只有一些临时变量用于交换。

优点

  1. 简单直观:选择排序的思想容易理解,实现起来也很简单。
  2. 交换次数较少:相比于冒泡排序,选择排序在数据量较大时,交换次数相对较少。

缺点

  1. 时间复杂度较高:无论数组是否已经部分有序,选择排序都需要进行 n(n-1)/2 次比较,因此时间复杂度较高,效率低。
  2. 不稳定:选择排序是一个不稳定的排序算法,如果两个相同的元素在数组中,他们在排序后可能会出现相对位置的变化。

选择排序的Java实现

public class SelectionSort {public static void selectionSort(int[] arr) {int n = arr.length;// 外层循环遍历数组for (int i = 0; i < n - 1; i++) {// 假设当前元素是最小值int minIndex = i;// 内层循环在剩余未排序部分中寻找最小值for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j; // 更新最小值的索引}}// 交换最小值和当前位置的元素int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}}public static void main(String[] args) {int[] arr = {64, 25, 12, 22, 11};System.out.println("排序前的数组:");for (int num : arr) {System.out.print(num + " ");}System.out.println();selectionSort(arr);System.out.println("排序后的数组:");for (int num : arr) {System.out.print(num + " ");}}
}

代码说明

  1. selectionSort方法:

    • 外层循环遍历数组,从第一个元素开始。
    • 假设当前位置的元素是最小值,记录它的索引 minIndex
    • 内层循环从当前位置的下一个元素开始,查找更小的元素,如果找到,则更新 minIndex
    • 内层循环结束后,交换 minIndex 对应的元素和当前元素的位置。
  2. main方法:

    • 创建一个待排序的数组 arr
    • 调用 selectionSort 方法对数组进行排序。
    • 输出排序前和排序后的数组。

这篇关于排序算法之选择排序详细解读(附带Java代码解读)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110797

相关文章

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二: