0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

排序算法之选择排序

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-09-25 16:30 次阅读

选择排序: (Selection sort)是一种简单直观的排序算法,也是一种不稳定的排序方法。

选择排序的原理:

一组无序待排数组,做升序排序,我们先假定第一个位置上的数据就是最小的,我们用一个参数记录这个最小的数,然后依次把后面的每个位置的数据和这个最小的比较,如果比这个数小就替换两个位置数据,等到第一轮比较完成就能确定最小的数据排在第一位了,然后第二轮从第二个位置开始,相同的方式比较,每次都能找到本轮最小的值,直至全部待排元素个数为0的时候,数组就排好顺序了。

选择排序流程图

图片

我们来进行详细解析看看

首先我们给个无序数组[4,6,15,9,12,3,32]进行升序排序,因为需要确定每个数组的长度,所以需要比较数组长度-1轮,当前面的元素都排好了之后,那么数组最后一个元素自然就确定了位置。

我们定义两个值,minIndex,minNum用来分别表示每一轮的找到的最小值的下标和值,后面未排序的值都和minNum比较,从而找出每一轮的最小值。

  • 第一轮我们以下标为1的第一位作为标志位(也就是把第一个值当做最小值),那么此时minIndex=0,minNum=4,经过和 minNum 比较发现后面只有3比4小,那么3和4交换位置,minIndex=5,minNum=3,把4换到下标为5的位置,如下图所示:

图片第一轮我们得到的结果是[3,6,15,9,12,4,32],本轮最小数是:3,所以3放到本轮标志位,也就是第一位

  • 第二轮:拿到第一轮排序的值作为初始值[3,6,15,9,12,4,32],同第一轮一样,此时6作为标志位minNum=6,minNum和其他比较,只有4比6小,需要交换位置,如下图所示图片第二轮排序结果[3,4,15,9,12,6,32],本轮最小数是:4
  • 第三轮:初始值[3,4,15,9,12,6,32],这次标志位15,minNum=15,minIndex=2,minNum先比和9比较,发现9比15小,minNum=9,minIndex=3,然后minNum和12比较,不需要替换minNum,再和6比较,minNum=6,minIndex=5,后面再比较已经没有比6小了,那么本轮就是初始标志位15和下标为5,值为6的数据换位置。图片
    第三轮排序结果[3,4,6,9,12,15,32],本轮最小数是:6
  • 第四、五、六轮:初始值[3,4,6,9,12,15,32],经过前面的比较我们可以看到数组已经排序完成,但是程序并不知道,会继续比较下去,把下标为4、5、6位置都作为标志位比较一次,发现都不需要变动位置,那么最终执行完成之后就能排序完成图片第四、五、六轮排序结果[3,4,6,9,12,15,32]

到这,我们已经清楚了每个步骤做了什么,那么接下来上代码验证一下:

Java代码实现

public class selectionSort {
     public static void main(String[] args){
          int[] arr = new int[]{4,6,15,9,12,3,32};
         for(int i=0;i< arr.length-1;i++){//每次循环都会找出最小的数
             //记录最小数的下标
             int minIndex = i;
             //记录最小数
             int minNum = arr[i];
             //每次循环都会找出最小的数
             for(int j=i+1;j< arr.length;j++){
                 if(arr[j]< minNum){//如果当前数比最小数小,则更新最小数
                     minNum = arr[j];//更新最小数
                     minIndex = j;//更新最小数的下标
                 }
             }
             //将最开始假定的小的数移动到真实最小的位置
             arr[minIndex]=arr[i];
             arr[i]=minNum;//将标志位放到最小数原来所在的位置
             
             //打印结果,方便查看
             System.out.print("第"+(i+1)+"轮[");
             for(int a=0;a< arr.length;a++){
                 System.out.print(arr[a]+"t");
             }
             System.out.println ("],本轮最小数是:"+minNum);
         }
         System.out.print("最终结果[");
         for(int i=0;i< arr.length;i++){
             System.out.print(arr[i]+"t");
         }
         System.out.println("]");
     }
 }

输出结果

1[3 6 15 9 12 4 32 ],本轮最小数是:32[3 4 15 9 12 6 32 ],本轮最小数是:43[3 4 6 9 12 15 32 ],本轮最小数是:64[3 4 6 9 12 15 32 ],本轮最小数是:95[3 4 6 9 12 15 32 ],本轮最小数是:126[3 4 6 9 12 15 32 ],本轮最小数是:15
  最终结果[3 4 6 9 12 15 32 ]

时间复杂度

我们通过上面的细节拆分发现,无论是否是已经排好的还是没排好的情况,我们都需要每个数字都比较到,那么就出现N个元素的数组,第一轮是n次比较,第二轮是从第二个位置开始,那么就是n-1,第三轮就是n-2次... 最后是1,那么就出现了n+(n-1)+(n-2)+(n-3)...1,这是一个等差数列,求和为一个二次型多项式,因为等差数列求和会出现二次型;我们取最高阶就是n^2,所以时间复杂度就是O(n^2),而且最好和最坏的情况时间复杂度都是O(n^2)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6511

    浏览量

    87600
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102994
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66771
  • 排序算法
    +关注

    关注

    0

    文章

    50

    浏览量

    10020
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25595
收藏 人收藏

    评论

    相关推荐

    FPGA排序-冒泡排序介绍

    排序算法是图像处理中经常使用一种算法,常见的排序算法有插入排序、希尔
    发表于 07-17 10:12 669次阅读
    FPGA<b class='flag-5'>排序</b>-冒泡<b class='flag-5'>排序</b>介绍

    嵌入式stm32实用的排序算法 - 交换排序

    合很多,我这里就不再一一举例说明,掌握排序的基本算法,到时候遇到就有用武之地。Ⅱ、排序算法分类1.按存储分类:内部排序和外部
    发表于 04-12 13:14

    C语言教程之几种排序算法

    数据结构的排序算法有很多种。 其中, 快速排序 、希尔排序、堆排序、直接选择
    发表于 11-16 10:23 1626次阅读

    c语言排序算法选择排序

    应广大"鸟友"强烈要求,小编将会推出《排序系列》,给大家讲讲排序那些事。        那么今天首先给大家讲解最符合人类思维逻辑的超简单排序法☞《选择
    发表于 11-16 10:25 3319次阅读
    c语言<b class='flag-5'>排序</b><b class='flag-5'>算法</b>之<b class='flag-5'>选择</b><b class='flag-5'>排序</b>法

    排序算法及其在OFDM中的应用

    随着科技的飞速发展,排序算法不再仅限于计算机领域,越来越来多优异的排序算法开始应用于无线通信领域。OFDM需要选择信道条件好的子载波进行数据
    发表于 12-27 17:03 0次下载

    常用的排序算法总览

    我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序
    的头像 发表于 06-13 18:18 2596次阅读
    常用的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>总览

    常用的非比较排序算法:计数排序,基数排序,桶排序的详细资料概述

    这篇文章中我们来探讨一下常用的非比较排序算法:计数排序,基数排序,桶排序。在一定条件下,它们的时间复杂度可以达到O(n)。
    的头像 发表于 06-18 15:11 6819次阅读
    常用的非比较<b class='flag-5'>排序</b><b class='flag-5'>算法</b>:计数<b class='flag-5'>排序</b>,基数<b class='flag-5'>排序</b>,桶<b class='flag-5'>排序</b>的详细资料概述

    常用排序算法分析

    一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序选择排序,插入排序,归并
    的头像 发表于 07-13 16:13 1968次阅读

    C语言中的排序算法了解

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到
    的头像 发表于 11-12 14:52 2483次阅读

    实用的排序算法 - 交换排序

    实用的排序算法 - 交换排序
    的头像 发表于 03-20 09:53 1558次阅读
    实用的<b class='flag-5'>排序</b><b class='flag-5'>算法</b> -  交换<b class='flag-5'>排序</b>

    详谈选择排序算法的定义和过程

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存
    的头像 发表于 06-30 17:06 3260次阅读
    详谈<b class='flag-5'>选择</b><b class='flag-5'>排序</b><b class='flag-5'>算法</b>的定义和过程

    排序算法分享:归并排序说明

    我们今天继续给大家分享排序算法里面的另外一种排序算法:归并排序
    的头像 发表于 12-24 14:34 599次阅读

    常见排序算法分类

    本文将通过动态演示+代码的形式系统地总结十大经典排序算法排序算法 算法分类 —— 十种常见排序
    的头像 发表于 06-22 14:49 630次阅读
    常见<b class='flag-5'>排序</b><b class='flag-5'>算法</b>分类

    嵌入式算法12---排序算法

    关键字:冒泡排序选择排序、插入排序、标准库函数qsort摘要:嵌入式系统中尤其涉及数据采集的,需要对数据进行简单处理后再进行业务层功能,考虑到硬件的资源限制,对于数据
    的头像 发表于 11-26 16:05 457次阅读
    嵌入式<b class='flag-5'>算法</b>12---<b class='flag-5'>排序</b><b class='flag-5'>算法</b>

    排序算法有哪些

    1. 归并排序(递归版) 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治策略,即分为两步:分与治。 分:先递归分解数组成子数组 治:将分阶段得到的
    的头像 发表于 10-11 15:49 323次阅读
    <b class='flag-5'>排序</b><b class='flag-5'>算法</b>有哪些