选择排序算法介绍

在这里插入图片描述

算法介绍

选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是每次从待排序的元素中选取最小(或最大)的元素,放到已排序部分的末尾,直到全部元素排序完毕。

以下是选择排序的详细步骤:

  1. 首先,在待排序序列中找到最小(或最大)的元素,并将它与序列的第一个元素进行交换。这样,该元素就被放置在已排序序列的起始位置。
  2. 接下来,在剩余的待排序序列中找到最小(或最大)的元素,将它与序列的第二个元素进行交换。这样,该元素就被放置在已排序序列的末尾位置,且已排序序列长度增加1。
  3. 重复上述步骤,直到所有元素都排列好。

以下是选择排序的示例代码实现(使用升序排序为例):

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[i];arr[i] = arr[minIndex];arr[minIndex] = 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 + " ");}selectionSort(arr);System.out.println("\n排序后的数组:");for (int num : arr) {System.out.print(num + " ");}}
}

以上代码演示了选择排序的过程。在每一轮迭代中,它找到未排序部分的最小元素,并将其与未排序部分的起始位置进行交换。通过不断缩小未排序部分的范围,直到整个数组排序完成。

选择排序的时间复杂度为O(n^2),其中n是待排序序列的长度。尽管选择排序在时间复杂度上不是最优的,但它的实现简单易理解,并且在小规模数据或部分有序的数据排序时性能较好。

算法优化

对选择排序进行一些简单的优化可以提高其性能,以下是两种常见的优化方法:

  1. 最小/最大值优化:在每一轮选择最小(或最大)元素时,可以同时记录最小值和最大值的索引,然后分别交换到已排序序列的起始位置和末尾位置。这样可以减少每轮迭代中的比较次数,从而提高效率。

  2. 优化无需交换:在每一轮找到最小(或最大)元素的索引后,并不立即进行交换操作,而是等待整个序列遍历完毕,最后再统一进行交换。这样可以减少交换操作的次数,由于交换操作需要移动数据,减少了数据的移动次数可以提高效率。

下面是基于上述两种优化方法的选择排序示例代码实现:

public class SelectionSort {public static void selectionSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;int maxIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;} else if (arr[j] > arr[maxIndex]) {maxIndex = j;}}if (minIndex != i) {swap(arr, i, minIndex);}// 如果最大值的索引被交换到了i位置,更新maxIndexif (maxIndex == i) {maxIndex = minIndex;}if (maxIndex != n - 1) {swap(arr, n - 1, maxIndex);}}}public static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = 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 + " ");}selectionSort(arr);System.out.println("\n排序后的数组:");for (int num : arr) {System.out.print(num + " ");}}
}

这些优化方法可以在某些情况下提高选择排序的性能,但需要注意的是,选择排序的时间复杂度仍然是O(n^2),因此对于大规模数据排序,更高效的排序算法如快速排序、归并排序等可能更合适。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/22944.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10.5.2 【Linux】命令执行的判断依据, ,||

cmd ; cmd &#xff08;不考虑指令相关性的连续指令下达&#xff09; 在某些时候&#xff0c;我们希望可以一次执行多个指令&#xff0c;例如在关机的时候我希望可以先执行两次sync 同步化写入磁盘后才 shutdown 计算机&#xff0c;那么可以这样作&#xff1a; [rootstudy ~]…

实现一个vscode插件:打开多个vscode项目时根据.nvmrc文件自动切换nvm

开发背景与最终功能 需要维护一些老项目&#xff0c;同时开发新项目时&#xff0c;切换nvm很烦人 最终实现vscode插件&#xff1a;每个vscode实例打开一个项目&#xff0c;切换vscode实例时能自动切换版本&#xff08;需要项目根目录有一个.nvmrc文件&#xff09; 插件下载 …

数学建模———层次分析法及其matlab语法,函数和代码实现

层次分析法思想登场 建模比赛中最基础的模型之一&#xff0c;其主要用于解决评价类问题&#xff08;例如&#xff1a;选择那种方案最好&#xff0c;哪位运动员或者员工表现的更优秀。&#xff09; 评价类问题字眼&#xff1a; 评价的目标是什么&#xff1f;达到这个目标有那…

【已解决】JavaScript为控件绑定事件死活不生效

本博文源于最近操作的JavaScript一个诡异的事情。我在用js一个动态生成的按钮&#xff0c;然后想要为其绑定一个alert的事件&#xff0c;结果发现控制台给我报未定义的错误&#xff0c;我慌的不要要的&#xff0c;经过长时间胡乱尝试终于解决了。 问题再现 dataHtml "&…

uniapp 打包安卓apk (原生App)云打包

uniapp 打包安卓apk (原生App)云打包 hbuilder中操作 项目的一些配置appid DCloud appid 用途/作用/使用说明&#xff1a; https://ask.dcloud.net.cn/article/35907 右键我们项目目录-》发行-》原生APP-云打包 说明&#xff1a; 1. 打包安卓&#xff0c;只选择安卓打包项&…

【Redis】—— Redis的RDB持久化机制

&#x1f4a7; 【 R e d i s 】—— R e d i s 的 R D B 持久化机制 \color{#FF1493}{【Redis】 —— Redis的RDB持久化机制} 【Redis】——Redis的RDB持久化机制&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞…

Jupyter notebook添加与删除kernel

目录 1 添加虚拟环境的kernel 2 删除jupyter notebook已有的kernal 3 切换内核与查看当前内核 4 添加C语言的kernel 5 添加python2的kernel 6 添加java语言的kernel 6.1 sudo apt install default-jre 6.2 下载并安装 ijava 6.3 sudo apt install openjdk-11…

RabbitMQ ---- Hello World

RabbitMQ ---- Hello World 1. 依赖2. 消息生产者3. 信息消费者 本节使用 Java 编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者。 1. 依赖 <!--指定 jdk 编译版本--><build><plugins><plugin><groupId>org.apache.maven.plu…

前端开发中的微服务架构设计

前端服务化和小程序容器技术为前端应用带来了更好的组织结构、可维护性和可扩展性。这些技术的应用将促进前端开发的创新和发展&#xff0c;使团队能够更好地应对复杂的前端需求和业务挑战。通过将前端视为一个服务化的架构&#xff0c;我们能够构建出更强大、可靠且可持续的前…

独立看门狗 IWDG

独立看门狗介绍 Q&#xff1a;什么是看门狗&#xff1f; A&#xff1a;可以理解为对于一只修勾的定时投喂&#xff0c;如果不给它吃东西就会狂叫&#xff0c;因此可以通过观察修勾的状态来判断喂它的人有没有正常工作。 在由单片机构成的微型计算机系统中&#xff0c;由于单…

Pixi + Tone 实现简单midi音频可视化

依赖库 Pixi.js 是一个前端图形渲染库&#xff0c;使用精灵技术绘制高性能的图形。Tone.js是一个前端音频框架&#xff0c;对web audio api进行了封装&#xff0c;可以快速创建音频样本、音频效果、进行音频分析和音频播放。tonejs/midi是tonejs的一个插件&#xff0c;可以讲m…

解决小程序 scroll-view 里面的image有间距、小程序里面的图片之间有空隙的问题。

1&#xff09;小程序 image跟view标签上下会有间隙&#xff0c;解决方法如下&#xff1a; 在image那里设置vertical-align:top/bottom/text-top/text-bottom 原因&#xff1a;图片文字等inline元素默许是跟父级元素的baseline对齐&#xff0c;而baseline又和父级底边有必定间距…