选择排序就这么简单

AI文本水印技术解析:从Claude隐形水印到Unwatermark破解 数字水印技术通过在多媒体数据中嵌入隐蔽信息,用于版权保护和内容溯源。其原理是在不显著影响载体质量的前提下,将特定标识信息编码到数据特征中。在AI生成内容(AIGC)时代,这项技术被应用于大语言模型生成的文本,形成AI文本水印,通过调整词汇选择概率或语法结构,在文本生成过程中植入统计特征标记。这种技术对维护学术诚信、防止虚假信息传播和保障内容版权具有重要价值,广泛应用于内容审核、版权追踪和教育评估等场景。近期引发关注的Unwatermark项目,正是针对Claude AI模型的隐形水印机制,通过文本重写和统计 阅读详情

选择排序就这么简单

从上一篇已经讲解了冒泡排序了,本章主要讲解的是选择排序,希望大家看完能够理解并手写出选择排序的代码,然后就通过面试了!如果我写得有错误的地方也请大家在评论下指出。

选择排序介绍和稳定性说明

来源百度百科:

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。

上面提到了选择排序是不稳定的排序方法,那我们的冒泡排序是不是稳定的排序方法呢?稳定的意思指的是什么呢?

判断某排序算法是否稳定,我们可以简单理解成:排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同

  • 如果相同,则是稳定的排序方法。
  • 如果不相同,则是不稳定的排序方法

如果排序前的数组是[3,3,1],假定我们使用选择排序的话,那第一趟排序后结果就是[1,3,3]。这个数组有两个相同的值,它俩在array[0]和array[1],结果经过排序,array[0]的跑到了array[2]上了。

那么这就导致:2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序不相同,因此,我们就说它是不稳定的

再回到上面的问题,上一篇说讲的冒泡排序是稳定的,主要原因是:俩俩比较的时候,没有对相等的数据进行交换(因为没必要)。因此它不存在2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序不相同。

那么稳定排序的好处是什么?

  • 参考知乎回答@独行侠的回答:

如果我们只对一串数字排序,那么稳定与否确实不重要,因为一串数字的属性是单一的,就是数字值的大小。但是排序的元素往往不只有一个属性,例如我们对一群人按年龄排序,但是人除了年龄属性还有身高体重属性,在年龄相同时如果不想破坏原先身高体重的次序,就必须用稳定排序算法.

很清晰的指出,只有当在“二次”排序时不想破坏原先次序,稳定性才有意义

参考资料:

一、第一趟排序

它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置,直到全部待排序的数据元素排完

首先,我们创建数组,找到它最大的值(这就很简单了):



    int[] arrays = {2, 3, 1, 4, 3, 5, 1, 6, 1, 2, 3, 7, 2, 3};

    //假定max是最大的
    int max = 0;


    for (int i = 0; i < arrays.length; i++) {
        if (arrays[i] > max) {
            max = arrays[i];
        }
    }

随后这个最大的数和数组末尾的数进行交换:


    //使用临时变量,让两个数互换
    int temp;
    temp = arrays[11];
    arrays[11] = arrays[13];
    arrays[13] = temp;

那么经过第一趟排序,我们的最大值已经到了数组的末尾了。

二、第二趟排序

再次从数组获取最大的数(除了已经排好的那个):


    int max2 = 0;
    for (int i = 0; i < (arrays.length - 1); i++) {
        if (arrays[i] > max2) {
            max2 = arrays[i];
        }
    }

    System.out.println(max2);

再将获取到的最大值与数组倒数第二位交换:


    temp = arrays[7];
    arrays[7] = arrays[12];
    arrays[12] = temp;

经过第二次排序,已经能够将数组最大两个数进行排序了

三、代码简化

从前两趟排序其实我们就可以摸出规律了:

  • 一个数组是需要n-1趟排序的(因为直到剩下一个元素时,才不需要找最大值)
  • 每交换1次,再次找最大值时就将范围缩小1
  • 查询当前趟数最大值实际上不用知道最大值是多少(上面我查出最大值,还要我手动数它的角标),知道它的数组角标即可,交换也是根据角标来进行交换

第一趟:遍历数组14个数,获取最大值,将最大值放到数组的末尾[13]
第二趟:遍历数组13个数,获取最大值,将最大值放到数组倒数第二位[12]

….

数组有14个数,需要13趟排序。



    //记录当前趟数的最大值的角标
    int pos ;

    //交换的变量
    int temp;


    //外层循环控制需要排序的趟数
    for (int i = 0; i < arrays.length - 1; i++) {

        //新的趟数、将角标重新赋值为0
        pos = 0;

        //内层循环控制遍历数组的个数并得到最大数的角标
        for (int j = 0; j < arrays.length - i; j++) {

            if (arrays[j] > arrays[pos]) {
                pos = j;
            }

        }
        //交换
        temp = arrays[pos];
        arrays[pos] = arrays[arrays.length - 1 - i];
        arrays[arrays.length - 1 - i] = temp;


    }

    System.out.println("公众号Java3y" + arrays);

四、选择排序优化

博主暂未想到比较好的优化方法,如果看到这篇文章的同学知道有更好的优化方法或者代码能够写得更好的地方,欢迎在评论下留言哦!

查到的这篇选择排序优化方法,感觉就把选择排序变了个味,大家也可以去看看:

五、扩展阅读

C语言实现

          int findMaxPos ( int arr[], int n)
        {
            int max = arr[0];
            int pos = 0; 
            for (int i = 1; i < n; i++) {
                if (arr[i] > max) {
                    max = arr[i];
                    pos = i;
                }
            }
            return pos;
        }

        void selectionSort ( int arr[], int n)
        {
            while (n > 1) 
            {
                int pos = findMaxPos(arr, n);
                int temp = arr[pos];
                arr[pos] = arr[n - 1];
                arr[n - 1] = temp;
                n--;//
            }
        }

        int main ()
        {
            int arr[] = {5, 32, 7, 89, 2, 3, 4, 8, 9};
            selectionSort(arr, 9);
            for (int i = 0; i < 9; i++)
                cout << arr[i] << endl;
        }

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

选择排序:简单选择、树形选择 选择排序(Selection Sort):经过一趟排序,可以从n-i+1(i=1,2...)个记录中选取关键字最小的记录作为有序序列中第i个记录。也就是说,每一趟排序,都会排好一个元素的最终位置。 其中最简单的是 简单选择排序(Simple Selection Sort) 简单选择排序的思想是 在每一趟排序中,通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录 阅读详情

相关推荐

Python与Wind量化接口实战:从配置到数据提取全流程解析

本文详细解析了Python与Wind量化接口的实战应用,从环境配置到数据提取全流程。通过Anaconda管理Python环境,安装WindPy接口,实现历史行情、截面数据和实时行情的查询与优化。文章还提供了高级功能如批量查询、数据缓存策略及实战案例,帮助开发者高效构建量化分析框架。

omega的博客 1327

“选择算法”

翻译自维基百科:http://en.wikipedia.org/wiki/Selection_algorithm         在计算机科学里,选择算法(selection algorithm)是一种用于在一个列表中查找第K小的数的算法(这个数也被称之为第K个顺序统计量)。这

lxiaoxiaot的专栏 8256

STM32F103C8T6用官方bootloader实现IAP升级操作方法

在使用STM32F103C8T6单片机IAP功能时,可以自己写bootloader程序,也可以使用官方bootloader文件。下面说一下使用官方bootloader的使用方法。 首先下载官方bootloader文件 目前使用的是这个版本,打开文件夹,选择适合自己编译器的工程。 目前使用的是keil,所以打开MDK-ARM文件夹 打开IAP工程 打开后根据自己的单片机型号,对工程进行简单的修...

HXYDJ的博客 1万+

【数据结构与算法】选择算法 selection

选择算法指的是解决选出序列中第n大的元素。比如中位数。 方法如下: 1.使用priorityqueue,维持size为k,如果queue的size小于k,则直接加入,否则看最小的元素能否比得过,比得过就剔除最小元素,加入新元素,比不过就看后面的元素,最后返回堆顶元素即可。这里需要使用最小堆。 public int findKthMax(int[] array, int k){ P...

u010900754的专栏 2983

Ubuntu22.04实战:基于VLLM高效部署Qwen3系列模型并构建Dify智能体

本文详细介绍了在Ubuntu22.04系统上使用VLLM高效部署Qwen3系列模型并集成Dify平台的实战指南。从环境配置、Conda管理到VLLM优化部署,再到Dify智能体构建,提供了全面的技术方案和性能调优建议,帮助开发者快速实现AI模型的高效部署与应用。

weixin_28323057的博客 161

Modscan32连接上了却没数据?一文拆解所有报错(从“Device NOT CONNECTED”到“Checksum Error”)

本文深入解析Modscan32连接异常问题,从状态栏报错到数据异常,提供系统化的诊断思路和解决方案。涵盖物理层问题、配置参数错位、端口占用冲突等常见故障,帮助工程师快速定位和解决Modbus通信中的各类错误。

weixin_30384217的博客 397

【算法algorithm】选择(Selection)排序

算法思想 在每一次的循环中,找到最小值(放到“最前边”),然后交换两个位置上的值;重复。 代码实现 public static void main(String[] args) { // 构造一个无序的数组 int[] arr = {2,5,6,8,9,7,4,1,3,0}; sort(arr); System.out.println(Arrays.toString(arr)); } public static void sort(int[] arr) {

ooooooooooooooxiaosu的博客 406

ISP工程师实战笔记:5种Demosaic算法优缺点对比(含Hamilton/DFPD代码片段)

本文从ISP工程师实战角度,深入对比了五种经典Demosaic算法的优缺点。文章详细剖析了双线性插值、Hamilton、DFPD、DLMMSE和GBTF等算法的核心思想、实现差异与性能表现,并提供了Hamilton和DFPD算法的关键代码片段。重点探讨了在图像信号处理流水线中,如何根据画质、计算复杂度和功耗等工程约束进行算法选型与权衡。

weixin_42527589的博客 248

重复的选择算法 selection(计数法)

重复的选择算法 selection(计数法)源代码:http://blog.youkuaiyun.com/cxjddd/archive/2004/07/29/55752.aspx  对不起,我无法使用一个准确的标题,下面描述问题:有一定数量元素(假定无重复),每次都从中复制出一个元素;列出复制若干次时所有可能的结果。比如,从 {1, 2, 3} 里复制 2 次,可以有 (1, 1)、(1, 2)、(1

BenBear's Blog 1457

sphincs+ Nist Round3文档中文译版(SPHINCS+ Submission to the NIST post-quantum project, v.3)

1. 引言 哈希基础签名方案最初是由Lamport [14]在1970年代后期作为一次性签名方案开发的,并由Merkle [16]扩展为多次签名方案。这些方案的安全性易于分析,并仅依赖于所使用的哈希函数的属性。然而,Merkle基于树的签名方案需要在密钥生成时就确定要进行签名的数量,且为了保持性能这个数字要小。最重要的是,该系统需要用户记住一个状态:这个状态包含一些信息以记住密钥已经进行了多少次签名。 在Lamport方案诞生后的40年里,产生了许多想法改进了哈希基础签名的性能、实用性和理论基础,最终XMS

dedanddwb的博客 394

64.qt quick-qml使用高德地图插件实现V2版本(新增:位置搜索、路径规划、轨迹编辑等)

qt quick-qml高德地图插件(新增:位置搜索、路径规划、轨迹编辑等) Qt地图插件,使用简单方便,不用浏览器内核,运行高效迅速 跨平台支持,(Qt Windows(MinGW, MSVC)\Linux(桌面、嵌入式)\Android\IOS\等) 在线更新瓦片地图下载,并且支持缓存保存离线地图实现.........

抵抗时间扭曲,坚持做一件有意义的事 6130

简单选择排序

文章目录简单选择排序的工作原理时间复杂度分析案例分析代码实现 简单选择排序的工作原理 选择排序(Selection sort)是一种简单直观的排序算法。 它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 选择排序的主要优点与数据移动有关。如果某个元素位于正确的...

Joy 3万+

PCB板设置20H 原则理解

20H原则是PCB设计中抑制EMI辐射的关键方法,要求电源层比相邻地层内缩20倍介质厚度(20H)。在四层板中实现20H原则需采用S-G-P-S层叠结构,确保GND与PWR紧邻。具体步骤包括:确定GND-PWR间介质厚度H,计算20H值(通常80-120mil),并在设计软件中将电源层四周内缩20H,同时保持地层完整不内缩。注意避免常见误区,如混淆介质厚度、地层内缩等。该原则能有效限制边缘场辐射,降低EMI干扰,是四层板EMC设计的重要规范。

qq_37999850的博客 693

选择排序之简单选择排序

选择排序的原理:选择排序的主要操作是选择,主要思想:每趟排序在待排序序列中选择最小的元素记录,添加到有序序列中。选择排序主要有简单选择排序(直接选择排序)和堆排序,堆排序算法可以看作是简单选择排序算法的改进;这里主要介绍简单选择排序算法。...

m0_64529905的博客 3062

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

简单选择排序与直接选择排序

是对元素直接排序 而先获取到元素的最大值或最小值下标再进行交换每次遇到n-1>n 的时候就要发生交换;则只是记录下较大那个元素的位置,这样一轮过后这个记录变身本轮所要选取的最大值,而每轮需要确定的位置已由外层循环确定,只需将最大元素位置记录所对应的元素与要确定的位置交换机可。话不多说直接上代码演示。

orehrepuS的博客 3887

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

简单选择排序详解

1、什么是选择排序? 选择排序是第一次从待排序的元素中选取最大值(或者最小值),将其放在序列的最前面,再从剩下的待排序元素中选取最大值(或者最小值)放入序列的最后,重复该操作直到剩下的待排序的元素的个数是0,选择排序是一种简单直观的排序算法。 2、简单选择排序和堆排序的关联 选择排序是从待排序的元素中选择最大值(或者最小值),然后将其放入序列中排序。选择排序分为简单选择排序和堆排序,简单选择排序和堆排序的区别在:从待排序的元素中选择最大值(或者最小值)的方式不同,简单排...

weixin_44713306的博客 7023

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

简单选择排序_选择排序之简单选择排序(Java)

选择排序之简单选择排序(Java) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从arr[0]arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[...

weixin_39989159的博客 206

选择排序:简单选择排序

1.选择排序思想 (1.1)选择排序的基本思想是:每一趟(例如第i趟)在后面n-i+1(i=1,2, ... , n)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到第n-1趟做完,待排序元素只剩下1个,就不用再选了。选择排序中的堆排序算法是重点内容。 2.简单选择排序的思想 (2.1)从上面选择排序的思想中可以很直观第得出简单选择排序算法的思想:假设排序表为L[1 ... n],第i趟排序即从L[i ... n]中选择关键字最小的元素与L[i]交换,每一趟排序可以确定一个...

weixin_39363245的博客 960

数据结构-选择排序(简单选择排序,堆排序)

目录 1,简单选择排序 1.1,简单选择排序思想 1.2,选择排序的时间复杂度分析 1.3,简单选择排序代码实现 2,堆排序 2.1,什么是堆排序 2.2,堆排序的思想 2.3,堆排序时间复杂度分析 2.4,代码实现 1,简单选择排序 1.1,简单选择排序思想 选择排序(Selection sort)是一种简单直观的排序算法。 简单选择排序算法的比较次数和初始的序列排列顺序无关。 它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,.

理科男同学 2420

选择类排序法 — 简单选择排序

9.4 选择类排序法 选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。我们主要介绍简单选择排序、树型选择排序和堆排序。    简单选择排序 简单选择排序的基本思想:第i趟简单选择排序是指通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。共需进行i-1趟比较,直到所有记录排序完成为止

Rprop 2万+

选择排序——简单选择排序

思路 思路非常简单。就是第一轮循环选出最大的元素,第二轮循环选出第二大的元素。。。。 代码 package dataStructureAndAlgorithms; public class SelectSort_heapSort { public static void main(String args[]) { int[] array = { 4, 2, 8, 9, 5, 7, 6, ...

copbint 638

选择排序(简单选择排序--改进的简单选择排序--堆排序)

选择排序:每一趟从待排序序列中选一个按序所需要的记录,放在已排好序的子序列之前或之后,保持有序,这样,有序子序列每次增加一个记录,直到全部记录排完为止。1、简单选择排序基本思想:每一趟从待排记录序列中选具有最小关键字值的记录,顺序放在已排好序的子序列后,直到全部记录排完。步骤:(1)在第i(i=1,2,3,......,n-1)次挑选步骤中,在记录r[i],r[i+1],r[n]中挑出最小值r(2...

Unique-You的博客 828

选择排序算法-简单选择排序

文章目录算法简介Java 实现时间复杂度空间复杂度算法稳定性 算法简介 简单选择排序(Select Sort)或者叫直接选择排序,可以说是排序算法中最简单的一个,同时它的思路也很简单明了,就是通过多轮选择,每轮选择中找到那个最小的数放在该轮序列的最前面,经过 array.length -1 轮之后就可以找到所有轮次中最小的那个然后从小到大的顺序就排好了。 简单选择排序一般来讲不稳定,时间复杂度 O...

abcnull 的博客 1275

简单排序算法:简单选择排序(选择排序)

简单选择排序法:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1 import java.util.Arrays; public class Solution { public static void main(String[] args) { Solution s = new Solution(); int[] arr

DirBee的博客 1368
上一篇: WebService就是这么简单
下一篇: Lucene就是这么简单
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值