算法一步一步走之选择排序

十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序 冒泡排序、选择排序、插入排序、快速排序、希尔排序 阅读详情

Java-选择排序

排序之选择排序

选择排序(Selection sort)是一种简单直观的排序算法。
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素。
存放在序列的起始位置。
然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法.

需求

对一组数组进行排序。
private static int[] array={-9,-8,-111,-1,01,9,3,4,5,16,7,8,9};
可以看到我们的需求是对这些数字进行排序。
但这里先只对其中的一部分:正数,做排序。
private static int[] arr = {9,8,7,5,6,4,1,9,2,3};
代码如下:
	private static int[] arr = {9,8,7,5,6,4,1,9,2,3};
    public static void main(String[] args) {
        int min = 0;
        for (int i = 0; i < arr.length; i++) {
            if(min > arr[i]){
                min = arr[i];
            }
        }
        System.out.format("最小的数字为::%d",min);
    }
	最小的数字为::0

那么这里就是有问题的了。
如果我们的数字里不包含0的话,这里始终得不到真正的最小值的。

我们对它进行修改:

private static int[] arr = {9,8,7,5,6,4,1,9,2,3};
    public static void main(String[] args) {
        int min = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if(min > arr[i]){
                min = arr[i];
            }
        }
        System.out.format("最小的数字为::%d\n",min);
    }
	最小的数字为::1

然后,正式进行排序的时候
那么我们正式对这部分数据进行排序,但是排序的时候又出问题了???啥子情况

private static int[] arr = {9,8,7,5,6,4,1,9,2,3};

    public static void main(String[] args) {
        int min = 0;
        for (int j = 0; j < arr.length; j++) {
            System.out.format("排序之qian::%s\n", Arrays.toString(arr));
            // 数组中的一个数字,记录最小的数字
            min = arr[j];
            // 最小数字的位置
            int index = 0;
            for (int i = j ; i < arr.length; i++) {
                if(min > arr[i]){
                    min = arr[i];
                    index = i;
                }
            }
            // 交换位置
            int temp = arr[index];
            arr[index] = arr[j];
            arr[j] = temp;
            
            System.out.format("最小的数字位置::%d\n",index);
            System.out.format("Jde 位置::%d\n",j);
            System.out.format("排序之后::%s\n", Arrays.toString(arr));
            System.out.println("----------------");
        }
    }
排序之qian::[9, 8, 7, 5, 6, 4, 1, 9, 2, 3]
最小的数字位置::6
Jde 位置::0
排序之后::[1, 8, 7, 5, 6, 4, 9, 9, 2, 3]
----------------
排序之qian::[1, 8, 7, 5, 6, 4, 9, 9, 2, 3]
最小的数字位置::8
Jde 位置::1
排序之后::[1, 2, 7, 5, 6, 4, 9, 9, 8, 3]
----------------
排序之qian::[1, 2, 7, 5, 6, 4, 9, 9, 8, 3]
最小的数字位置::9
Jde 位置::2
排序之后::[1, 2, 3, 5, 6, 4, 9, 9, 8, 7]
----------------
排序之qian::[1, 2, 3, 5, 6, 4, 9, 9, 8, 7]
最小的数字位置::5
Jde 位置::3
排序之后::[1, 2, 3, 4, 6, 5, 9, 9, 8, 7]
----------------
排序之qian::[1, 2, 3, 4, 6, 5, 9, 9, 8, 7]
最小的数字位置::5
Jde 位置::4
排序之后::[1, 2, 3, 4, 5, 6, 9, 9, 8, 7]
----------------

排序之qian::[1, 2, 3, 4, 5, 6, 9, 9, 8, 7]
最小的数字位置::0
Jde 位置::5
排序之后::[6, 2, 3, 4, 5, 1, 9, 9, 8, 7]
// 这里排序之后,我擦,怎么回事??

----------------
排序之qian::[6, 2, 3, 4, 5, 1, 9, 9, 8, 7]
最小的数字位置::9
Jde 位置::6
排序之后::[6, 2, 3, 4, 5, 1, 7, 9, 8, 9]
----------------
排序之qian::[6, 2, 3, 4, 5, 1, 7, 9, 8, 9]
最小的数字位置::8
Jde 位置::7
排序之后::[6, 2, 3, 4, 5, 1, 7, 8, 9, 9]
----------------
排序之qian::[6, 2, 3, 4, 5, 1, 7, 8, 9, 9]
最小的数字位置::0
Jde 位置::8
排序之后::[9, 2, 3, 4, 5, 1, 7, 8, 6, 9]
----------------
排序之qian::[9, 2, 3, 4, 5, 1, 7, 8, 6, 9]
最小的数字位置::0
Jde 位置::9
排序之后::[9, 2, 3, 4, 5, 1, 7, 8, 6, 9]
----------------

好吧。发现问题。这之后的时候,不时出现最小数字位置为:0的语句。之后就会和数组的第一位的数字进行交换。
那么我们就观察,发现,index是决定最小数字位置的。在这里会出现几次最小数字位置为0的情况。
如果它是0的话。说明

if(min > arr[i]){
    min = arr[i];
    index = i;
}

这段比较结果为false。index的值是什么呢,还是0,保持不变。
这时候发现

排序之qian::[1, 2, 3, 4, 5, 6, 9, 9, 8, 7]
最小的数字位置::0
Jde 位置::5

如果我们进行比较的话,就是

arr[j];j = 5;
// 6 > 6,6 > 9,6 > 9,6 > 8,6 > 7
if(6 > 6){
// 这里的赋值语句永远执行不了
	min = arr[i];
    index = i;
}

经过修改之后,发现我们不知min需要随着j变化而变化,还有index,也需要:修改后的代码如下:

int min = 0;
        for (int j = 0; j < arr.length; j++) {
            System.out.format("排序之qian::%s\n", Arrays.toString(arr));
            // 数组中的一个数字,记录最小的数字
            min = arr[j];
            // 最小数字的位置-----这里进行了修改
            int index = j;
            for (int i = j ; i < arr.length; i++) {
                if(min > arr[i]){
                    min = arr[i];
                    index = i;
                }
            }
            // 交换位置
            int temp = arr[index];
            arr[index] = arr[j];
            arr[j] = temp;
        }

这里修改 index的初始值为 j。应对,如果第一位就是最小数字的情况。
最终的输出结果为:

排序之后::[1, 2, 3, 4, 5, 6, 7, 8, 9, 9]

那到这里,我们的正数排序就完成了。
接下来看看,带负数的排序。

private static int[]array={-9,-8,-111,-1,0,1,9,3,4,5,16,7,8,9};

第一边,直接用原来的方法排序:

排序之后::[-111, -9, -8, -1, 0, 1, 3, 4, 5, 7, 8, 9, 9, 16]

额,一边就好的吗???
好吧。这次很顺利。之前在家里写遇到了别的问题。具体情况参考 index 的位置。
是min出现了问题。min的值每次都赋值:0。
因为有负数,每次min记录的都是0,在对负数排序之后,在正数中 0 是最小的。所以导致负数之后排序中的数字位置都变成了0。
这里也是这样。只不过换了个形式。
另一边的解决方案是:

if(min > array[i]){
     min = array[i];
     index = i;
 }
 // 记录最大的数值的位置
 if(min < array[i]){
      max = array[i];
  }
  // 交换位置
  // 略 。。。 。。。
  // 这里将min的值记录成为最大值。
  min = max;

这就是我看选择排序绝当自己实现的经历以及遇到的一些情况。
当然,这里没有遇到负数排序的问题。
这里是自己公司午休的时间写的,遇到的新问题。以及俩个问题之间的总结。相似而不相同。

【排序算法(一)】选择排序及其改进 选择排序是一种原地排序算法。适用于小文件。由于选择操作是基于键值的交换在需要时才执行,所以选择排序常用于数值较大和键值较小的文件。 优点 容易实现 原地排序(不需要额外的存储空间) 缺点 扩展性较差 :O(N2N^2N2) 算法 寻找未排序序列中的最小值 用当前位置交换最小值 堆所有元素重复上述过程,直到整个序列排序完成 Java版本实现 public voi... 阅读详情

相关推荐

【排序算法】选择排序

选择排序 文章目录选择排序@[toc]思路具体实现算法性能分析时间复杂度稳定性参考实现优化参考文献 思路 遍历整个数组,找到最小的元素,与数组第一个元素交换,再找到第二小的元素,与数组第二个元素交换,以此类推,直到数组全部排序。 具体实现 算法性能分析 时间复杂度 选择排序的交换操作介于 0 和 (n - 1) 次之间。 选择排序的比较操作为 n (n - 1) / 2 次之间。 选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。 比较次数O(n^2),比较次数与关键字的初始状态无关,总

silent_sunshine的博客 992

直接选择排序是不稳定的,以及怎样将它变成稳定的排序。

首先了解一下什么叫排序算法的稳定性。定义:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。 那么直接选择排序为啥不稳定呢?举个栗子,我们有一个序列:8* 3 5 4 8 3 1 9 我们用直接选择排...

yishengguoke的博客 8912

排序算法之选择排序详解

1、基本介绍 选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。 它的基本思想是:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]~arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]~arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]~ar...

∑ 694

【排序算法】选择排序、堆排序

堆排序是一种基于堆(Heap)数据结构的排序算法。最大堆:每个节点的值都大于或等于其子节点的值。根节点是最大值。最小堆:每个节点的值都小于或等于其子节点的值。根节点是最小值。首先将无序数组构建为一个最大堆。然后,将堆顶(即最大值)与数组的最后一个元素交换,缩小堆的范围,对剩下的元素继续调整成最大堆,直到排序完成。

2301_76677973的博客 2940

排序算法之 选择排序

选择排序   选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。   常用的选择排序方法有简单选择排序和堆排序。 简单选择排序 在介绍选择排序算法前,我们再回顾下冒泡算法。 冒泡算法是通过两两比较,不断交换,逐个推进的方式,来进行排序的。 一次遍历,得......

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 3万+

医院网络设计(完整文档+思科拓扑图)

大家好,我是小华学长,一名计算机领域的博主。经过多年的学习和实践,我积累了丰富的计算机知识和经验,在这里我想与大家分享我的学习心得和技巧,帮助你成为更好的程序员。作为一名计算机博主,我一直专注于编程、算法、软件开发等领域,在这些方面积累了大量的经验。我相信分享是一种双赢的方式,通过分享,我可以帮助他人提升技术水平,同时也能够得到学习交流的机会。在我的文章中,你将会看到我对于各种编程语言、开发工具以及常见问题的解析和分析。我会结合自己的实际项目经验,为你提供实用的解决方案和优化技巧。

qq1325513482的博客 2万+

C语言排序算法之选择排序

文章目录一、选择排序的概述二、选择排序算法代码详解(1)算法分析(2)选择排序算法代码详解三、总代码 一、选择排序的概述 选择排序(Selection sort)是一种简单直观的排序算法。 它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。 二、选择排序算法代码详解 (1)算法分析     &nbsp

weixin_52785320的博客 1万+

Zotero+Obsidian+Bookxnote联动让文献阅读丝滑般体验

摘录文字或图片到Obsidian

weixin_43694742的博客 1万+

选择排序稳定吗_算法一看就懂之 选择排序

来自:不止思考上一篇文章咱们已经聊过「 冒泡排序 」和「 插入排序 」了,今天我们来看一看「 选择排序 」。「 选择排序 」虽然在实际应用中没有「 插入排序 」广泛,但它也是我们学习排序算法中必不可少的一种。「 冒泡排序 」和「 插入排序 」都是在两层嵌套循环中慢慢比较元素,不停的调整元素的位置。而「 选择排序 」就比较直接了,属于不出手则已,一出手,相应的元素就必须要到位,元素的位置就...

weixin_39644325的博客 7702

谈谈 FOC和BLDC 电机控制

更具体地说,通过 “Park 变换”,我们可以把三相交流电流信号转换成两相直流电流信号,从而可以把三相交流电机的控制变得和两相直流电机控制一样简单。在内环 “电流环”中,一些比较重要的模块有 “Clark 变换” 和 “Park 变换” 等数学模块、电机电流信号检测模块以及能够提供电机的转速和转角位置信息的模块。日前,Qorvo 电机控制应用高级系统/应用工程师张绍发表了一个与 BLDC 和 FOC 相关的演讲,科普了 FOC 的相关知识,还讲解了 Qorvo 用于简化 FOC 实施方案的方法。

U_YAO的博客 2119

Discuz IIS上传附件大于28M失败报错Upload Failed.修改maxAllowedContentLength(图文教程)

下图:Discuz X3.5的系统信息,上传许可为1024MB(1GB)论坛为局域网论坛,仅供内部同事交流使用!使用官方最新的Discuz! X3.5 Release 20231221 UTF-8 下图:选择上传附件(提示可以最大上传100M) 下图:模拟上传84M的文件(

骚团长的博客 1830

常见排序算法之选择排序——直接选择排序、堆排序

哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的选择排序,主要有直接选择排序以及——堆排序(有点难理解),包您一看就会,快来试试吧~ ​

保护小周ღ的博客 2341

UE4_SpeedTree Shader源码分析

目录 1.UMaterialExpressionSpeedTree::Compile 2.Compiler->SpeedTree 3.GetSpeedTreeVertexOffset 4.Scene中的SpeedTree应用 (Scene->UpdateSpeedTreeWind) 5.GetSpeedTreeVertexOffsetInner 由于之后做风场,也需要在S...

zzgyy123的专栏 2631

排序算法总结(一)——选择排序

选择排序的基本宗旨就是每次选出剩余元素中最大的或者最小放在最终排序的对应位置。 1.直接选择排序 基本思想: 在a[1]-a[n-1]中选择最小的元素和a[0]交换; 在a[2]-a[n-1]中选择最小的元素和a[1]交换; …… 在a[i]-a[n-1]中选择最下的元素和a[i-1]交换; 以此类推。。。。。。 算法步骤: 循环比较: 第一轮:将a[0]和a[1]-a[n-1...

JSJWR的博客 3795

<IBM DB2>《DB2 官方监控脚本 2022版本》

DB2 监控脚本

Else 的博客 672

【AI理论学习】手把手推导扩散模型:Diffusion Models(DDPM)

生成扩散模型DDPM如下图所示分为前向、逆向两个过程,它首先通过不断往原始清晰数据中添加噪声使其变成标准高斯噪声(前向过程),而后期望从标准高斯噪声中还原原始数据(逆向过程)。若能实现,那便可从已知的标准高斯分布中采样一个噪声数据,而后利用DDPM模型生成符合原始数据分布的新数据。 Diffusion模型包含两个过程:数学符号:y∝xy\propto xy∝x:y正比于x,即y随着x增大而线性增大。 条件概率:贝叶斯公式:p(A∣B)=p(B∣A)×p(A)p(B)p(A|B)=\frac{p(B|A)\

小哲的博客 1512

(一)算法——冒泡排序、选择排序

强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan 简介 算法是解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。——摘自百度百科 为什么要用算法呢?假设现在给出三个数A,B,C,请你找出这三个数中最大的一个数。答案不止一种,不过我猜,有一部分人要选择if...el...

至尊宝 2万+

【GB28181】wvp-GB28181-pro++ZLMediaKit编译安装国标流媒体服务器教程(Windows平台)

本文基于ZMLMediaKit+WVP-PRO在windows平台进行编译部署GB28181平台,网上教程也比较多,都大同小异,实际操作过程中容易出错的地方也比较多:redis安装无密码,mysql安装后密码的修改以及wvp数据可的创建,配置文件侧修改,尤其是和端口相关的项,再就是运行服务时各种错误需要注意,常见的错误已经做了汇总,遇到问题大家不要怕,找到报错的地方查看定位即可。

废人一枚的博客 4479

排序 —— 置换-选择算法

一、引入 生成初始归并段时,我们把含有 n 个记录的文件传入内存,按照给定的 内排序算法 或 置换-选择排序算法 划分成 m 个规模较小的有序的记录段。 内排序算法生成初始归并段的过程如下: 把含有 n 个记录的文件,按内存大小 w 分成若干长度为 w 的子文件(归并段); 分别将各子文件(归并段)调入内存,采用有效的内排序方法排序后送回外存。产生 n/w 个初始归并段。 我们可以看到,使用...

starter_____的博客 5627

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

选择排序算法

  选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。   选择排序就是从当前未排序的整数中找一个最小的整数,将它放在已排序的整数列表的最后。   要点: 比较相邻的两个数,如果左边的数大于右边的数,就进行交换。   例如: 将数组 { 4,2,8,0

大彤小忆的博客 9073

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

一张图精通多种排序算法的选择策略

排序算法是计算机科学中的基石,广泛应用于数据处理、搜索优化和日常业务逻辑中。冒泡排序以其简单性适用于教学和小数据集;选择排序则因其稳定性而受到青睐;插入排序效率高于几乎有序的数据。希尔排序通过优化插入排序提升性能,适用于中等规模数据集。归并排序以其稳定的时间复杂度和稳定性,成为合并操作的首选。快速排序以其分治策略和高效性成为处理大数据集的优选。堆排序则因其原地排序特性而广泛应用于资源受限环境。计数排序和基数排序专为特定数据范围设计,提供线性时间复杂度的解决方案。桶排序则适用于处理均匀分布的大数据集。这些算法

肖哥弹架构博客 1277

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

排序算法 | 选择排序

排序算法是算法领域十分经典的一类算法,它的名字通俗易懂:给数字排序,让一组无序的数据通过排序算法后,能增序或者降序地输出。 排序算法有很多种,本文来详细讲讲 "选择排序法"。 (本文均是增序排序,降序排序同理即略) 1、算法理解 先看看上图给 "6 5 4 3 2 1" 6个数字增序排序的流程。 大体过程: 我们把一串待排序的数字分为已排序、和待排序的...

weixin_43787043的博客 1733

排序算法代码实现(一)—— 选择排序

以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使用 交换数组中两数位置 的操作,另外,为了方便我打印数组查看结果,我封装一个 ArrayBase.java基类,用来实现swap方法和printArray方...

CherishTheYouth的博客 1045

【一看就懂的图解算法】简单选择排序

简单选择排序 冒泡排序是将最大的元素往后面排,简单选择排序是将小的元素往前面排 算法思想: 1.将第一个元素和其余元素进行对比,如果第一个元素和其他元素相比,第一个元素大,则交换,一轮下来,最小的元素会在第一个 2.将第二个元素和其余的元素对比,如果对比结果大,则交换 3.重复 算法图解: 以此类推…… Java代码: void simpleSort(int[] a){ int t...

weixin_43878297的博客 6790

简单选择排序算法

简单选择排序算法 基本策略 每次从无序序列中选出一个关键字最大(最小)的记录添加到有序序列尾部 基本思想 第一趟:从长度为len的序列中选出关键字最大(最小)的记录与第1个记录交换 第二趟:从第2个数据开始,从长度为 len-1 的序列中选出关键字最大(最小)的记录与第2个记录交换 第三趟:从第3个数据开始,从长度为 len-2 的序列中选出关键字最大(最小)的记录与第3个记录交换 … 第 i 趟:从第 i 个数据开始,从长度为 len-i+1 的序列中选出关键字最大(最小)的记录与

有所热爱 有所坚持 7225

一步一步写算法(之选择排序)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】     选择排序是和冒泡排序差不多的一种排序。和冒泡排序交换相连数据不一样的是,选择排序只有在确定了最小的数据之后,才会发生交换。怎么交换呢?我们可以以下面一组数据

嵌入式-老费,一个分享专业嵌入式知识的blog 2万+
下一篇: Netty学习1
路上^_^
博客等级 码龄9年 225粉丝 203原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值