排序算法之详解选择排序

这篇具有很好参考价值的文章主要介绍了排序算法之详解选择排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引入

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

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

排序算法之详解选择排序

思路

  • 有了上面的一些基础之后,我们再来说说选择排序算法的思路
    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]

......

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

最后一次排序文章来源地址https://www.toymoban.com/news/detail-425177.html

  • 不断地进行排序之后,数组变成了个样子 [ -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;
}

到了这里,关于排序算法之详解选择排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言入门:冒泡法排序、交换法排序和选择法排序算法的详解(代码分析)

     冒泡法排序 :顾名思义,小的数据就好像水中的气泡一样总是逐渐往上升, 大的数据就像石块一样往下沉,因此称为冒泡法排序法。 假如有n个数字,则需要进行n-1轮  第一轮结果:最大的数,被放在了最后一位  第二轮:元素 ‘8’ 已经拍好了顺序,所以只用将前4个元素

    2024年02月03日
    浏览(36)
  • 详解八大排序算法-附动图和源码(插入,希尔,选择,堆排序,冒泡,快速,归并,计数)

    目录 🍏一.排序的概念及应用🍏  1.排序的概念  2.排序的应用  3.常用的排序算法 🍎二.排序算法的实现🍎 1.插入排序 1.1直接插入排序 1.2希尔排序(缩小增量排序) 2.选择排序 2.1直接选择排序 2.2堆排序 3.比较排序 3.1冒泡排序 3.2快速排序  递归版本 快速排序递归优化 快速

    2024年02月01日
    浏览(47)
  • C语言实现八大排序算法(详解插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序(递归和非递归)、归并排序(递归和非递归)和计数排序)

    本篇文章使用C语言实现了数据结构中常见的八大排序算法,它们分别是 插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序和计数排序 。在排序算法的实现过程中,每种算法都有其独特的特点和适用场景。插入排序通过逐步构建有序序列来排序,希尔

    2024年01月24日
    浏览(38)
  • 排序算法:选择排序(直接选择排序、堆排序)

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关排序算法的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、   目录 前言: 1.选择

    2024年02月09日
    浏览(29)
  • 【数据结构与算法】排序算法:冒泡排序,冒泡排序优化,选择排序、选择排序优化

    目录 一、冒泡排序 1、冒泡排序思想 2、冒泡排序算法的性能分析 代码实现: 二、选择排序 1、选择排序思想 2、选择排序算法的性能分析  代码实现: 1、冒泡排序思想 冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大(或最小)的元素移到右边(或左边

    2024年01月19日
    浏览(38)
  • 【算法】排序——选择排序和交换排序(快速排序)

     ========================================================================= 主页点击直达: 个人主页 我的小仓库: 代码仓库 C语言偷着笑: C语言专栏 数据结构挨打小记:初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记:LeetCode刷题 算法头疼记:算法专栏  =========================

    2024年02月08日
    浏览(34)
  • 【数据结构与算法】排序算法(选择排序,冒泡排序,插入排序,希尔排序)

    基本概念这了就不浪费时间解释了,这四种都是很简单的排序方式,本专栏后续文章会出归并排序,计数排序,快速排序,堆排序,桶排序等排序算法,今天这篇文章中给出选择排序,冒泡排序,插入排序和希尔排序的实现; 如果发现文章中有错误,还请大家指出来,我会非

    2024年02月15日
    浏览(50)
  • 排序算法(一) -- 选择排序和冒泡排序

    选择排序和冒泡排序是我们初学C语言必学的两种简单的排序算法,也是我们以后学习数据结构与算法课程中更复杂的排序算法的基础。本文用由浅入深的逻辑条理,试图将这两种排序算法讲解清楚。 本文所有的排序均是针对一维数组的,全文所用的一维数组的例子如下: 一

    2024年02月06日
    浏览(25)
  • 排序算法:选择排序

    选择排序的思想是:双重循环遍历数组,每经过一轮比较,找到最小元素的下标,将其交换至首位。         选择排序就好比第一个数字站在擂台上,大吼一声:“还有谁比我小?”。剩余数字来挨个打擂,如果出现比第一个数字小的数,则新的擂主产生。每轮打擂结束

    2024年02月11日
    浏览(72)
  • 【算法系列 | 3】深入解析排序算法之——选择排序

    你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色 :重要标题 红色 :用来标记结论 绿色 :用来标记一级论点 蓝色 :用来标记二级论点 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包