Java选择排序、二分查找

news2024/11/17 13:13:00

一、选择排序

1.选择排序的思想

每轮选择当前的位置,开始找后面的较小值与该位置进行交换。

第一轮:选择当前位置,开始找后面的较小值与该位置进行交换。

 5与1交换后,1就在当前位置,因此,1与后面的所有值进行比较,后面的值都大于1,所以1的位置不变。

 第二轮:选择当前位置,当前位置是5,所以5与3比较,大于3,所以5与3进行交换

5与·3交换后,3就在当前位置,因此,3与后面的所有值进行比较,后面的2小于3,所以3与2进行交换

第三轮:选择当前位置,当前位置是5,所以5与3比较,大于3,所以5与三进行交换

2.选择排序的关键 

确定总共需要选择几轮:数组的长度-1。

比如:数组有5个元素,只需要比4轮,就可以排序完

控制每轮从当前位置为基准,与后面元素选择几次

    public static void main(String[] args) {
//        定义数组传入一组数据
        int[] numbers = {4,1,2,3};
//        输出原数组内容
        System.out.println("排序前"+ Arrays.toString(numbers));
//        定义外部for循环,控制选择几轮:数组长度-1
        for (int i = 0; i < numbers.length -1; i++) {
//            定义内部for循环,控制选择几次:当前位置+1,也就是后一位
            for (int j = i+1; j < numbers.length; j++) {
//                当前位置:numbers[i]
//                如果后面有比当前位置更小的数据,则进行交换
                if (numbers[j]<numbers[i]){
//                    交换位置
//                    先定义一个临时变量将当前位置的数据存一下
                    int temp = numbers[i];
//                    再将后面的数据赋值给当前的位置
                    numbers[i] = numbers[j];
//                    最后将当前位置的数据赋值给后面的位置
                    numbers[j] = temp;
                }
            }
        }
//        全部交换完成,输出排序后的数组内容
        System.out.println("排序后"+Arrays.toString(numbers));
    }

二、二分查找

1.基本查找

需求:

我要查找数组中的3在哪个位置索引?

如果是基本查找,就需要从第一个位置一个一个的往后找。

结论:在数据量特别大的时候,基本查找从前往后寻找的性能是很差的。

2.二分查找 

二分查找性能好,前提必须是排好序的数据。

二分查找相当于每次去掉一半的查找范围。

找到元素的执行原理:

需求:

我要查找数组中的3在哪个位置索引?

 二分查找会定一个位置在首,定一个位置在尾。

之后会找,首和尾的一半的位置。

 

然后发现数据3小于首和尾一半位置的数据,直接从左边开始找,将右边干掉

因此,尾部的位置就是:一半的位置-1.

然后,又找首和尾的一半的位置。

之后,发现数据3大于首和尾一半位置的数据,直接从右边开始找,将左边干掉。

 

 然后,首都的位置就是:一半的位置+1

之后,又找首和尾一半的位置

然后,发现数据11大于首和尾一半位置的数据,直接从右边开始找,将左边干掉

  然后,首位置就是:一半的位置+1

之后,又找首和尾一半的位置。

 然后,发现数据11大于首和尾一半位置的数据,直接从右边开始找,将左边干掉。

此时,首位置就是:一半位置+1,然后发现首尾位置重合了,因此,一半的位置还是自己,但是已经是最后一次查找了,数据还是不相等 

结论:二分查找正常的检索条件是首位置min<=尾位置max,但是现在是!=,因此属于找不到,元素不存在

    public static void main(String[] args) {
//        定义一个数组,传入一组数据
        int [] arr ={11,33,44,99,15,35};
//        二分查找的前提是排好序的数据,所以先排序
        Arrays.sort(arr);
//        输出排好序的数据内容
        System.out.println("排序后"+ Arrays.toString(arr));
//        调用二分查找的方法查找元素
        int index1 = binarySearch(arr,15);
        System.out.println("该元素的位置索引:"+index1);
        int index2 = binarySearch(arr,99);
        System.out.println("该元素的位置索引:"+index2);

    }
//    二分查找算法的实现方法
    public static int binarySearch(int[]arr,int data){
//        定义首和尾
        int head =0;
        int tail = arr.length -1;
//        定义循环:当首位置<=尾位置时,开始二分查询
        while (head <= tail){
//        找首和尾位置的一半的位置(中间索引) 中间索引=(首索引-尾索引)/2
            int midIndex = (head +tail) / 2;
//            当要找的元素大于中间索引位置的元素时
            if (data > arr[midIndex]){
//                说明要找的元素在尾位置那边,更新首位置的索引 = 中间位置的索引-1
                head = midIndex+1;
            }else if (data < arr[midIndex]){
//                当要找的元素 小于 中间索引位置的元素时:
//                说明要找的元素在首位置那边,更新尾位置的索引 = 中间位置的索引-1
                tail = midIndex-1;
            }else {
//                当要找的元素等于中间索引位置元素时,说明要找的元素已经找到,返回该元素的位置索引
                return midIndex;
            }
        }
//        循环结束,说明找不到要找的元素返回-1
        return -1;
    }

控制台输出结果:

 

总结
数组的二分查找的实现步骤是什么?

定义变量记录首和尾的位置;
使用while循环控制二分查询(条件是首位置 <= 尾位置);
循环内部获取中间元素索引(中间元素的索引 = (首位置的索引 + 尾位置的索引) / 2);
判断当前要找的元素如果大于中间位置的元素,首位置 = 中间索引 +1;
判断当前要找的元素如果小于中间位置的元素,首位置 = 中间索引 -1;
判断当要找的元素如果等于中间位置的元素,返回当前中间元素的索引;
循环结束,说明查无此元素!返回-1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/445268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

看板与 Scrum:有什么区别?

看板和Scrum是项目管理方法论&#xff0c;以小增量完成项目任务并强调持续改进。但是他们用来实现这些目标的过程是不同的。看板以可视化任务和连续流程为中心&#xff0c;而Scrum更多是关于为每个交付周期实施时间表和分配设定角色。 在看板和Scrum之间做出选择并不总是必要…

【事故】记一次意外把公司项目放到GitHub并被fork,如何使用DMCA下架政策保障隐私

前言 &#x1f34a;缘由 在一个月黑风高的夜晚&#xff0c;正准备休息的我突然接到之前外包老总的亲切问候。一顿输出才知道三年前为了搭建流程化部署&#xff0c;将公司的测试代码放到github上后忘记删除。现在被甲方的代码扫描机制扫到&#xff0c;并且检查到代码已经被其他…

大数据环境生态搭建

文章目录 大数据环境生态搭建一、通用操作1、更改三台节点的主机名2、关闭三台机器 linux 的安全模式3、关闭三台机器的防火墙4、设置三台机器的免密的登录 二、安装 JDK1.8 大数据环境生态搭建 一、通用操作 1、更改三台节点的主机名 输入命令&#xff1a; hostnamectl set…

打通Web2与Web3 欧科云链用数据建桥

在刚刚过去的香港Web3嘉年华系列活动中&#xff0c;欧科云链以链上数据服务商的特别身份带来了新的行业视角&#xff0c;该集团旗下研究院高级研究员蒋照生观察&#xff0c;Web3涵盖的“数据革命”不仅局限于区块链领域&#xff0c;Web2行业同样有需求。 借助区块链数据的透明…

共话开源 - openKylin出席 FOSSASIA Summit 2023 开源盛会!

4月14日&#xff0c;openKylin社区受邀参加FOSSASIA Summit 2023开源盛会&#xff0c;给来自全球的技术开发者带来openKylin社区在RISC-V软硬件生态建设方面的经验与成果介绍&#xff0c;向大家展示中国开源社区的潜力&#xff0c;并同国际技术社区共研RISC-V未来之势。 FOSSA…

Oracle函数记录

一、各个函数介绍 1.OVER(PARTITION BY… ORDER BY…)--开窗函数 1.开窗函数用于为行定义一个窗口&#xff08;这里的窗口是指运算将要操作的行的集合&#xff09;&#xff0c;它对一组 值进行操作&#xff0c;不需要使用GROUP BY子句对数据进行分组&#xff0c;能够在同一…

苹果MT4手机软件怎么下载?下载后怎么使用?

比较了解外汇交易的投资者都知道&#xff1a;自2022年9月24日起&#xff0c;在Apple的App Store应用商店里面苹果MT4手机软件已经显示是不可下载的&#xff0c;究其原因就是苹果MT4手机软件被官方下架了&#xff01;看到这里先不要紧张&#xff0c;因为于2023年3月7日上午&…

100种思维模型之大脑系统思维模型-52

上世纪60年代&#xff0c;美国神经学家保罗 D 麦克莱恩&#xff08;Paul D. MacLean&#xff09;首次提出“三脑一体”假说&#xff0c;他认为人的大脑是蜥蜴-松鼠-猴子合体的隐喻&#xff0c;代表了进化发展不同阶段的遗传。 复旦大学管理学院的项保华教授对此有一个精彩的总结…

代码随想录_回溯_leetcode77 216 17

leetcode 77. 组合 77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a; …

促进创新成果高质量发展,华秋“戴上举劳模和工匠人才创新工作室”成立!

4月14日&#xff0c;为充分发挥劳模和工匠人才、工会先进集体和个人示范引领作用&#xff0c;树立典型、鼓励先进&#xff0c;全面推进福田区劳模和工匠人才创新工作室创建和福田区工会组织建设工作&#xff0c;深圳市福田区2023年劳模和工匠人才创新工作室现场交流会在新一代产…

【SAS应用统计分析】软件的基本操及SAS数据集的整理

声明&#xff1a;本文内容来自网络&#xff0c;如有侵权请联系删除。本文还参照了B站up主庄7的课程内容【公开课】数据分析与SAS【15课】 目录 实验背景 实验步骤 步骤一&#xff1a;了解SAS系统的主要窗口及其功能。 步骤二&#xff1a;运行如下程序 语法规则&#xff1a…

vue-过滤器

vue允许定义过滤器&#xff0c;对于一些文本常见格式化。过滤器可以用在两个地方 -&#xff08;1&#xff09;v-bind 表达式 -&#xff08;2&#xff09;{{}}插值表达式 使用&#xff1a;使用过滤器&#xff1a;{{ xxx | 过滤器名}} 或 v-bind:属性 "xxx | 过滤器名"…

Day952.如何降低认知负载 -遗留系统现代化实战

如何降低认知负载 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是 关于如何降低认知负载的内容。 认知负载。这个看似与软件开发毫无瓜葛的知识&#xff0c;实际上却决定了软件系统的成败。 因此在遗留系统现代化中&#xff0c;把“以降低认知负载为前提”作为首要原则…

设计模式-结构型模式之适配器模式(Adapter)

结构型模式简介 结构型模式(Structural Pattern)描述如何将类或者对 象结合在一起形成更大的结构&#xff0c;就像搭积木&#xff0c;可以通过 简单积木的组合形成复杂的、功能更为强大的结构。 结构型模式可以分为类结构型模式和对象结构型模式&#xff1a; 类结构型模式关心类…

Springboot整合redis实现缓存

此次笔记是在实现了数据库的增删改查操作的基础上进行的&#xff0c;因此需要准备数据库、数据表&#xff0c;以及实现相对应的服务层、持久层、控制层。可参考之前的笔记Spring Boot整合 druid、Mybatis-plus 一、Redis安装 Redis 是完全开源免费的&#xff0c;遵守BSD协议&…

【每日一短语】对(某人)吹毛求疵

1、短语及释义 get all sensitive on sb. 释义&#xff1a; 对某人吹毛求疵。 sensitive: 敏感的&#xff0c;引申为“事多的”&#xff0c;“爱挑刺的”。 2、示例及出处 美剧&#xff1a;《摩登家庭》第4季第7集 Modern Family, Season 4 Episode 7 Jay Pritchett: Don’t g…

中医诊所一定要去尝试软文营销,效果简直不要太好

中医诊所是一种传统的医疗机构&#xff0c;随着互联网时代的发展&#xff0c;软文营销已经成为了中医诊所宣传推广的一种重要方式。通过撰写高质量的软文&#xff0c;中医诊所可以提升品牌知名度、增加患者数量、提高医疗服务质量等方面取得良好的效果。今天结合我10年营销经验…

INDEMIND双目惯性模组运行实时ORB-SLAM3教程

现在实验室视觉SLAM已经不够满足&#xff0c;所以需要多模态融合&#xff0c;正巧购入高翔博士推荐的INDEMIND双目惯性模组&#xff0c;根据官方例程在中使用ros接入ORB-SLAM3INDEMIND的双目鱼眼imu模组&#xff0c;这回有SDK及ORB-SLAM3安装过程中的各种常见性问题解决方法及安…

Boost的安装

过程 boost是一个非常重要的东西&#xff0c;是对C函数库的扩展&#xff0c;非常得不错&#xff0c;是第三方扩展&#xff0c;不过不是一般的第三方&#xff0c;是C标准委员会工作组成员发起的。 通过vs命令工具进入boost目录 执行bootstrap.bat命令 开始安装 b2.exe instal…

JavaScript经典教程(二)-- CSS基础部分

179&#xff1a;HTML基础部分&#xff08;元素分类、特性、特殊元素等&#xff09; — 补充 1、盒子模型 定义&#xff1a;一个元素在页面中所占的位置大小&#xff0c;叫盒子模型。 包含的样式&#xff1a;即影响元素大小的样式&#xff1a; width、height、margin、padding…