数组三(冒泡排序、二分查找)

目录

冒泡排序算法

冒泡排序的基础算法

冒泡排序的优化算法

二分法查找


冒泡排序算法

        冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是 基本的素养。

冒泡排序的基础算法

        冒泡排序算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就 把他们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序算法的运作如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最 后的元素应该会是最大的数
  3. 针对所有的元素重复以上的步骤,除了最后一个
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
import java.util.Arrays;public class Test {public static void main(String[] args) {int[ ] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5, 8 };bubbleSort(values);System.out.println(Arrays.toString(values));}public static void bubbleSort(int[ ] values) {int temp;for (int i = 0; i < values.length; i++) {for (int j = 0; j < values.length - 1 - i; j++) {if (values[j] > values[j + 1]) {temp = values[j];values[j] = values[j + 1];values[j + 1] = temp;}}}}
}

冒泡排序的优化算法

        们可以把冒泡排序的算法优化一下

  1. 整个数列分成两部分:前面是无序数列,后面是有序数列。
  2. 初始状态下,整个数列都是无序的,有序数列是空。
  3. 每一趟循环可以让无序数列中最大数排到最后,(也就是说有序数列的元素个数增加 1),也就是不用再去顾及有序序列。
  4. 每一趟循环都从数列的第一个元素开始进行比较,依次比较相邻的两个元素,比较到 无序数列的末尾即可(而不是数列的末尾);如果前一个大于后一个,交换。
  5. 判断每一趟是否发生了数组元素的交换,如果没有发生,则说明此时数组已经有序, 无需再进行后续趟数的比较了。此时可以中止比较。
import java.util.Arrays;public class Test {public static void main(String[] args) {int[ ] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5, 8 };bubbleSort(values);System.out.println(Arrays.toString(values));}public static void bubbleSort(int[ ] values) {int temp;int i;// 外层循环:n个元素排序,则至多需要n-1趟循环for (i = 0; i < values.length - 1; i++) {// 定义一个布尔类型的变量,标记数组是否已达到有序状态boolean flag = true;/*内层循环:每一趟循环都从数列的前两个元素开始进行比较,比较到无序数组的最后*/for (int j = 0; j < values.length - 1 - i; j++) {// 如果前一个元素大于后一个元素,则交换两元素的值;if (values[j] > values[j + 1]) {temp = values[j];values[j] = values[j + 1];values[j + 1] = temp;//本趟发生了交换,表明该数组在本趟处于无序状态,需要继续比较;flag = false;}}//根据标记量的值判断数组是否有序,如果有序,则退出;无序,则继续循环。if (flag) {break;}}}
}

二分法查找

        二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元素 从小到大有序地存放在数组(array)中,首先将给定值 key 与数组中间位置上元素的关键码 (key)比较,如果相等,则检索成功;

        否则,若 key 小,则在数组前半部分中继续进行二分法检索;

        若 key 大,则在数组后半部分中继续进行二分法检索。

        这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。 二分法检索是一种效率较高的检索方法。比如,我们要在数组[7, 8, 9, 10, 12, 20, 30, 40, 50, 80, 100]中查询到 10 元素,过程如下:

import java.util.Arrays;public class Test {public static void main(String[] args) {int[ ] arr = { 30,20,50,10,80,9,7,12,100,40,8};int searchWord = 20; // 所要查找的数Arrays.sort(arr); //二分法查找之前,一定要对数组元素排序System.out.println(Arrays.toString(arr));System.out.println(searchWord+"元素的索引:"+binarySearch(arr,searchWord));}public static int binarySearch(int[ ] array, int value){int low = 0;int high = array.length - 1;while(low <= high){int middle = (low + high) / 2;if(value == array[middle]){return middle; //返回查询到的索引位置}if(value > array[middle]){low = middle + 1;}if(value < array[middle]){high = middle - 1;}}return -1; //上面循环完毕,说明未找到,返回-1}
}

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

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

相关文章

eUICC鉴权的一般步骤

eUICC&#xff08;嵌入式通用集成电路卡&#xff09;的鉴权过程涉及多个步骤&#xff0c;主要目的是确保eUICC的安全操作和用户的身份验证。以下是eUICC鉴权过程的一般步骤&#xff1a; 1. **初始化**&#xff1a;当用户启动设备或尝试连接到移动网络时&#xff0c;eUICC会开始…

2024-03-22 问AI: 介绍一下深度学习中的 sigmoid函数

文心一言 Sigmoid函数是深度学习中常用的一种激活函数&#xff0c;主要用于将神经元的输出值压缩到0和1之间。这种特性使得sigmoid函数在二分类问题中特别有用&#xff0c;因为输出值可以被解释为属于某个类别的概率。 sigmoid函数的数学表达式为&#xff1a; σ(x) 1 / (1…

Pytorch CUDA Reflect Padding 算子实现详解

CUDA 简介 CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA开发的一种并行计算平台和应用编程接口&#xff08;API&#xff09;&#xff0c;允许软件开发者和软件工程师使用NVIDIA的图形处理单元&#xff08;GPU&#xff09;进行通用计算。自2007…

为什么守护网络安全需要用高防IP

在数字化浪潮中&#xff0c;网络安全问题日益凸显&#xff0c;网络攻击事件频发&#xff0c;给企业的业务发展带来了严重威胁。面对这一挑战&#xff0c;高防IP应运而生&#xff0c;以其强大的防护能力和稳定的性能&#xff0c;成为企业网络安全的重要守护神。 高防IP&#xf…

NodeJS 集群模块: 为App创建集群实例

NodeJS 集群模块: 为App创建集群实例 目录 NodeJS 集群模块: 为App创建集群实例Node.js 集群介绍:终极扩展策略使用集群模块开始扩展 Node.js扩展 Node.js 的两种集群策略使用集群受益的 Node.js 应用程序示例没有集群的 Node.js:不可伸缩的原则集群操作:一个扩展的 Node.js…

Redis 配置与优化

目录 一、Redis 介绍 1.1、关系数据库与非关系型数据库 1&#xff09;关系型数据库 2&#xff09;非关系型数据库 3&#xff09;非关系型数据库产生背景 1.2、Redis 基础 1&#xff09;Redis 简介 2&#xff09;Redis 安装部署 3&#xff09;配置参数 1.3、Redi…

【聊一聊】三种工厂模式的创建

三种工厂模式的创建 今天终于星期五了,最近由于碰上一个需求,中间涉及Oracle改国产数据库的改造,好家伙,差点没把我忙坏了 不过今天终于有空啦!~哈哈哈 这篇本应该是上周就结束的,但是拖到今天,我们就今天进行结束 (还有一件快乐的事情,就是我遇见自己喜欢的人啦!嘻嘻) 好啦!~话…

【AI】发现一款运行成本较低的SelfHosting语言模型

【背景】 作为一个想构建局域网AI服务的屌丝,一直苦恼的自然是有限的资源下有没有对Spec要求低一点的SelfHosting的AI服务框架了。今天给大家介绍这款听起来有点希望,但是我也还没试验过,感兴趣的可以去尝试看看。 【介绍】 大模型生成式AI与别的技术不同,由于资源要求高…

Linux第83步_采用“Linux内核定时器”点灯以及相关API函数

“Linux内核定时器”是采用“系统时钟”来实现的。它不是周期性运行的&#xff0c;一旦发生超时就会自动关闭。如果想要实现周期性定时&#xff0c;那么就需要在定时处理函数中重新开启定时器。 Limux内核使用全局变量jiffies来记录“系统从启动以来的系统节拍数”&#xff0c…

路由器的端口映射能实现什么?

路由器的端口映射是一项重要的网络配置功能&#xff0c;它可以帮助实现局域网内外的设备之间的通信。通过端口映射&#xff0c;我们可以在公网上访问局域网内的设备&#xff0c;方便的进行远程访问、共享文件和资源等操作。 什么是端口映射&#xff1f; 在介绍端口映射之前&am…

C语言 字符串数组的输入输出

代码 #include <stdio.h>void main() {char arr[4];scanf("%s",arr);printf("%s\n",arr);for(int i 0 ; arr[i] ! \0 ; i){printf("%c\n",arr[i]);}char temp;for(int i 0;i < 3;i){for(int j 0;j < 3-i;j){if(arr[j]>arr[j…

近年C++面试题目

近年来&#xff0c;C面试题目主要涵盖了从基础知识到高级特性的各个方面。以下是一些常见的C面试题目&#xff1a; 1.基础知识&#xff1a; 解释C中的指针和引用&#xff0c;以及它们之间的区别。描述C中的内存管理&#xff0c;包括堆和栈的区别。阐述C中的面向对象编程概念&am…

Linux服务器在宝塔已经安装了node的前提下手动运行node项目

#一般情况&#xff0c;宝塔都可以正常启动node项目&#xff0c;正确安装依赖&#xff0c;但如果它出错了呢&#xff0c;死活安装不上&#xff0c; 这种情况可能就打算直接用ssh来安装了&#xff0c;但如果直接在ssh终端上输入npm install,会发现提示命令找不到&#xff0c;虽然…

【springcloud开发教程】spring cloud config——分布式配置

什么是SpringCloud config分布式配置中心&#xff1f; spring cloud config 为微服务架构中的微服务提供集中化的外部支持&#xff0c;配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。 spring cloud config 分为服务端和客户端两部分。 服务端也称为 …

MySQL 查询性能优化

优质博文&#xff1a;IT-BLOG-CN​ 如果把查询看作是一个任务&#xff0c;那么它由一些列子任务组成&#xff0c;每个子任务都会消耗一定的时间。如果要优化查询&#xff0c;实际上要优化其子任务&#xff0c;要么消除其中一些子任务&#xff0c;要么减少子任务的执行次数。通常…

【prometheus-operator】k8s监控redis

1、准备exporter https://github.com/oliver006/redis_exporter oliver006-redis_exporter-amd64.tar # 安装镜像 docker load -i oliver006-redis_exporter-amd64.tar # 上传镜像 docker tag oliver006/redis_exporter ip/monitor/redis_exporter:latest docker push ip/mo…

C#关键字 sealed、unsafe、volatile

sealed 应用于某个类时&#xff0c;sealed 修饰符可阻止其他类继承自该类。 在下面的示例中&#xff0c;类 B 继承自类 A&#xff0c;但没有类可以继承自类 B。 class A {} sealed class B : A {}还可以对替代基类中的 虚方法 或 属性的方法 或 属性 使用 sealed 修饰符。 这…

数据分析-Pandas分类数据的操作方法

数据分析-Pandas分类数据的操作方法 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&am…

xpath中使用正则表达式 及 包含 某 属性值

xpath中使用正则表达式 没想到吧 id 也可以模糊定位 比如有个网站正文部分是&#xff1a; //[id‘el-popover-123456’] 另一个同级别页面的正文是&#xff1a; //[id‘el-popover-456789’] 要抓取这种正文其实可以用xpath&#xff1a; //*[starts-with(id, el-popover-)]或…

八个 C++ 开源项目,帮助初学者进阶成长

对于C初学者来说&#xff0c;参与开源项目是提升编程技能、理解实际项目运作和学习最佳实践的绝佳方式。以下是八个适合C初学者的开源项目&#xff0c;可以帮助你进阶成长&#xff1a; 1. **SFML (Simple and Fast Multimedia Library)** - 网址: [SFML](https://www.sfml-…