排序算法之详解选择排序

news/2024/9/23 14:29:04/

引入

  • 选择排序顾名思义是需要进行选择的,那么就要问题了,选择到底是选择什么呢?
  • 选择排序的选择是选择数组中未排序的数组最小的值,将被选择的元素放在未排序数组首位

如果你对 ‘未排序数组’ , ‘选择’ 的概念不理解,那么你可以看看下面的图

思路

  • 有了上面的一些基础之后,我们再来说说选择排序算法的思路
    1. 不断的选择未排序数组中最小的值,将其与未排序数组的首位元素进行换位
    2. 选择完一个最小值,未排序的数组长度就要减一,且是从下标为0处开始减
    3. 当未排序数组就剩两个数时,就是最后一次选择,完成此次排序,算法结束,数组排序完成
  • 乍一看,选择排序算法有点像冒泡排序,只不过冒泡排序是选择大的数往后走,选择排序是选择小的数往前走
    1. 其实并不是这样的,数往前后走并没有关系
    2. 冒泡排序是经过不断的相邻换位,来完成排序的
    3. 而选择排序,只需选择(保存)最大或最小的数及这个数的下标,遍历完未排序数组之后,再进行一次换位
    4. 冒泡排序是通过数去找位置,选择排序是给定位置去找数
  • 如果你还不明白,那么就再看看下面这张图,说明:该图转载于菜鸟教程

 

具体实现过程

  • 下面我们就以 [ -8 , 10 , 30 ,6 , 9 , 10 , 100 , 76 ] 为例,讲解选择排序的具体过程

第一次排序

  • 我们先进行选择,将未排序数组的第一个元素作为被选则的元素 【value = -8 ,index = 0】
  • 用一个指针从未排序数组的第一个元素往后逐渐遍历 ,如果有小于当前 value 的 ,就将 value 和 index 的值替换为更小的元素的 值 和 下标
  • 遍历完成,由于没有小于 -8 的元素 ,所以value 和 index 不做改动 【即不交换】
  • 完成第一次排序之后,未排序的数组(逻辑意义上的数组)就变成了 [ 10 , 30 ,6 , 9 , 10 , 100 , 76 ] ,前面已排序的数组 [-8 ]

第二次排序

  • 我们先进行选择,将未排序数组的第一个元素作为被选则的元素 【value = 10 ,index = 1】
  • 用一个指针从未排序数组的第一个元素往后逐渐遍历 ,如果有小于当前 value 的 ,就将 value 和 index 的值替换为更小的元素的 值 和 下标
  • 先找到了 value1 = 6 , index1 = 3 ,改变 value 与 index的值 value= value1 , index = index1
  • 遍历完成,由于index经过了改变 ,所以需要进行换位 , 未排序数组第一个元素 与 index下标元素进行换位
  • 完成第二次排序之后,未排序的数组(逻辑意义上的数组)就变成了 [ 30 ,10 , 9 , 10 , 100 , 76 ] ,前面已排序的数组 [-8 , 6]

......

  • 就这样不断地重复,选择未排序数组中最小的值,将其与未排序数组的首位元素进行换位

最后一次排序

  • 不断地进行排序之后,数组变成了个样子 [ -8 , 6 , 9 ,10 , 10 ,30 , 100 ,76 ]
  • 此时已排序的数组变成了 [ -8 , 6 , 9 ,10 , 10 ,30 ] , 未排序的数组为 [ 100 ,76 ]
  • 我们只需进行最后一次排序,就可以完成整个数组的排序
  • 选择未排序数组的第一个元素 , index = 6 , value = 100
  • 通过指针遍历未排序数组 ,试着寻找 比 value小的数
    • 找到则交换 ,交换后进行下次寻找 ,直至数组遍历完成
  • 最终 ,index = 7 , value = 76
  • 由于此时 index已经改变 ,所以需要进行换位 ,未排序数组第一个元素 与 index下标元素进行换位

代码实现

// 选择排序算法
public static int[] selectSort(int[] array){// for循环 ,i表示需要正在选择 第 i 个 最小值 ,从0开始  // 一共需要找 array.length-1个最小值for (int i = 0; i < array.length-1; i++) {// val用于存储被选则的值 ,即最小值 // 默认选择未排序数组的第一个元素 ,如果有更小的则更新int val = array[i];// index用于存储当前最小值对应的数组下标// 默认选择未排序数组的第一个元素的下标 ,最小值更新,i也随之更新int index = i;     // 遍历未选择的数组for (int j = i+1; j < array.length; j++) {// 试图寻找比被选择的值 更小 的元素 ,如果有 ,则对 val 和 index 进行更新if (val > array[j]){val = array[j];index = j;}}// 如果 i == index ,则代表被选则的值并未改变,即还是未排序数组的第一个元素,所以不用交换if (i != index){array[index] = array[i];array[i] = val;}}return array;
}

  


http://www.ppmy.cn/news/1051652.html

相关文章

钢筋的形变屈服度测量

钢筋力学性能检测方法与检测报告《建筑材料检测技术》杨丛慧 建筑形变检测锚点&#xff0c;本身无实质内容。 建筑的倾角和形变检测方法&#xff0c;工程测量学&#xff0c;李章树 毫米级的卫星位移定位 挠度检测。 赛格事件&#xff1a;SHM-Structural Health Monitoring…

Android开发基础知识总结(一)初识安卓Android Studio

一.基础理论知识 1.Linux相当于是地基。 MIUI&#xff0c;EMUI等操作系统&#xff0c;是基于安卓的改版——且裁掉了一部分Google的服务。 &#xff08;鸿蒙虽然是改版&#xff0c;但和安卓的架构基本上一致&#xff09; 2.Kotlin和Java都是JVM语言&#xff0c;必须先复习好…

尚品汇项目(Day1)

项目结构介绍 vue-cli 脚手架初始化项目 node webpack 淘宝镜像 node_modules文件夹&#xff1a;项目依赖文件夹 public文件夹&#xff1a;一般放置静态资源&#xff08;图片&#xff09;&#xff0c;需要注意&#xff1a;放在public文件夹中的静态资源&#xff0c;webpac…

【并发编程的艺术读书笔记】synchronized锁升级机制详解

锁升级机制 简介锁升级流程三种锁的优缺点 简介 synchronized在早期被称为重量级锁&#xff0c;而到现在已经得到不少优化。偏向锁、轻量级锁、重量级锁指的是synchronized三种形态。 锁升级流程 无锁&#xff08;Unlocked&#xff09;&#xff1a; 初始状态&#xff0c;表示…

wifi高通驱动之WCNSS_qcom_cfg.ini以及MCS、空间流数的学习和记录

一、WCNSS_qcom_cfg.ini 这个文件说是可以调优wifi的带宽&#xff0c;还有MIMO技术 Android Wi-Fi MIMO/SISO设置方法&#xff08;基于高通平台&#xff09;_广凯的博客-CSDN博客 不是太了解&#xff0c;先记录一下&#xff0c;个人感觉MCS和MIMO技术最全的应该是下面的网址…

气导耳机有哪些品牌好?市面上热销不错的气传导耳机分享

​在当今快速的生活节奏中&#xff0c;气传导耳机成为了越来越多人的选择。它们以出色的音质和舒适度而广受好评。在本文中&#xff0c;我们将为您推荐四款市面上热销相当不错的气传导耳机&#xff0c;帮助你找到最适合自己的耳机。 推荐一&#xff1a;NANK南卡00压开放式耳机…

【SSL证书】阿里云免费 SSL证书申请 + nginx 部署全解

一、环境 二、步骤 三、实战 Stage 1&#xff1a;申请免费证书 1. 进入 - 数字证书管理服务(SSL证书&#xff09; 2. 创建证书 3. 申请证书 Stage 2&#xff1a;域名解析 1. 进入 - 域名管理 2. 点击 - 域名 3. 点击 - 域名解析 4. 点击 - 添加记录 5. 返回 - 数…

自然语言处理从入门到应用——LangChain:链(Chains)-[通用功能:自定义Chain和Chain的异步API]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 创建自定义Chain 要实现自己的自定义链式连接&#xff0c;我们可以子类化Chain并实现以下方法&#xff1a; from __future__ import annotations from typing import Any, Dict, List, Optional from pydantic impor…