Java 数组常见的排序和查找算法

2、数组
2.1、常见的算法:
排序算法:
冒泡排序算法
选择排序算法

查找算法:
二分法查找

2.2、算法实际上在 java 中已经封装好了。
排序可以调用方法。例如:java 中提供了一个数组工具类:
java.util.Arrays
Arrays 是一个工具类。
其中有一个 sort() 方法,可以排序。静态方法,直接使用类名调用就行。
工具类当中的方法大部分都是静态的。
java 有一套庞大的类库。

冒泡排序算法:
1、每一次循环结束之后,都要找出最大的数据,放到参与比较的这堆数据的最右边。(冒出最大的那个气泡。)
2、核心:拿着左边的数字和右边的数字比对,当左边>右边的时候,交换位置。
例:
原始数据:
3,2,7,6,8
第1次循环:(最大的数跑到最右边。)
2,3,7,6,8(3和2比较,2<3,所以2和3交换位置)
2,3,7,6,8(虽然不需要交换位置:但是3 和7 还需要比较一次。)
2,3,6,7,8(7和6交换位置)
2,3,6,7,8(虽然不需要交换位置:但是7 和8 还需要比较一次。)
经过第1次循环,此时剩下参与比较的数据:2,3,6,7
第2次循环:
2,3,6,7(2和3比较,不需要交换位置)
2,3,6,7(3和6比较,不需要交换位置)
2,3,6,7(6和7比较,不需要交换位置)
经过第2次循环,此时剩下参与比较的数据:2,3,6
第3次循环:
2,3,6(2和3比较,不需要交换位置)
2,3,6(3和6比较,不需要交换位置)
经过第3次循环,此时剩下参与比较的数据:2,3
第4次循环:
2,3(2和3比较,不需要交换位置)

选择排序:
每一次从这堆“参与比较的数据当中”找出最小值,
拿着这个最小值和“参与比较的的这堆最前面的元素”交换位置。

选择排序比冒泡排序好在:每一次的交换位置都是有意义的。选择排序比冒泡排序的效率高。高在交换位置的次数上。
循环一次,然后找出参加比较的这堆数据中最小的,拿着这个最小的值和最前面的数据交换位置。

原始数据:3 1 6 2 5
参与比较的数据:3 1 6 2 5
第1次循环之后的结果是:
1 3 6 2 5

参与比较的数据:3 6 2 5
第2次循环之后的结果是:
2 6 3 5

参与比较的数据:6 3 5
第三次循环之后的结果是:
3 6 5

参与比较的数据:6 5
第四次循环之后的结果是:
5 6

注意:5条数据,循环4次。
例:
冒泡排序:
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90};
bubbleSort(arr);
System.out.println(“排序后的数组:”);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}

public static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 1 - i; j++) {if (arr[j] > arr[j + 1]) {// 交换两个相邻的元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

}
输出结果为:
排序后的数组:
11 12 22 25 34 64 90

选择排序:
public class SelectionSort {
public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90};
selectionSort(arr);
System.out.println(“排序后的数组:”);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}

public static void selectionSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {int minIndex = i;for (int j = i + 1; j < arr.length; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}
}

}
输出结果为:
排序后的数组:
11 12 22 25 34 64 90

快速排序:
import java.util.Arrays;

public class QuickSort {
public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90};
quickSort(arr, 0, arr.length - 1);
System.out.println(“排序后的数组:”);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}

public static void quickSort(int[] arr, int low, int high) {if (low < high) {int pivotIndex = partition(arr, low, high);quickSort(arr, low, pivotIndex - 1);quickSort(arr, pivotIndex + 1, high);}
}private static int partition(int[] arr, int low, int high) {int pivot = arr[high]; // 选择最后一个元素作为枢轴int i = low - 1; // 索引 i 表示小于枢轴的元素的分界点for (int j = low; j <= high - 1; j++) {if (arr[j] < pivot) {i++; // 找到一个小于枢轴的元素// 交换 arr[i] 和 arr[j]int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 交换 arr[i+1] 和 arr[high](枢轴)int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1;
}

}
输出结果为:
排序后的数组:
11 12 22 25 34 64 90

归并排序:
public class MergeSort {
public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90};
mergeSort(arr, 0, arr.length - 1);
System.out.println(“排序后的数组:”);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}

public static void mergeSort(int[] arr, int low, int high) {if (low < high) {int middle = (low + high) / 2;mergeSort(arr, low, middle);mergeSort(arr, middle + 1, high);merge(arr, low, middle, high);}
}private static void merge(int[] arr, int low, int middle, int high) {int[] temp = new int[high - low + 1];int i = low;int j = middle + 1;int k = 0;while (i <= middle && j <= high) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}while (i <= middle) {temp[k++] = arr[i++];}while (j <= high) {temp[k++] = arr[j++];}for (int p = 0; p < temp.length; p++) {arr[low + p] = temp[p];}
}

}
输出结果为:
排序后的数组:
11 12 22 25 34 64 90

数组的元素查找
数组元素查找有两种方式:
第一种方式:一个一个挨着找,直到找到为止。
第二种方式:二分法查找(算法),这个效率较高。

二分法查找(折半查找):
第一:二分法查找建立在排序的基础之上。
第二:二分法查找效率要高于“一个挨着一个”的这种查找方式。
第三:二分法查找原理?
10(0下标) 23 56 89 100 111 222 235 600(下标9) arr数组
目标:找出600的下标
(0 + 9) / 2 --> 4(中间元素的下标)
arr[4]这个元素就是中间元素:arr[4]是100
100 < 600
说明被查找的元素在100的右边。
那么此时开始下标变成:4+1
(5 + 9) / 2 --> 7(中间元素的下标)
arr[7] 对应的是:235
235 < 600
说明被查找的元素在235的右边。
开始下标又进行了转变:7 + 1
(8 + 9)/2 --> 8
arr[8] --> 500
500 < 600
开始元素的下标又发生了变化:8 + 1
(9 + 9) / 2 --> 9
arr[9]是600,正好和600相等,此时找到了。
二分法查找的终止条件:一直折半,直到中间的那个元素恰好是被查找的元素。
3、二分法查找算法是基于排序的基础之上。(没有排序的数据是无法查找的。)
例:
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1, 2, 5, 67, 8, 29, 100, 300};
int target = 5;

    int index = binarySearch(arr, target);if (index != -1) {System.out.println("找到目标值,下标为:" + index);} else {System.out.println("未找到目标值");}
}public static int binarySearch(int[] arr, int target) {int left = 0;int right = arr.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid; // 查找成功,返回目标元素所在下标} else if (arr[mid] < target) {left = mid + 1; // 目标元素在右半部分,更新left} else {right = mid - 1; // 目标元素在左半部分,更新right}}return -1; // 查找失败,返回-1
}

}
输出结果为:
找到目标值,下标为:3
因此,值为5的下标为3。

介绍一下java.util.Arrays工具类
所有方法都是静态的,直接用类名调用
主要使用的是两个方法:
二分法查找,排序
以后要看文档,不要死记硬背。

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

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

相关文章

[渗透测试学习] Appointment - HackTheBox

文章目录 Task 1Task 2Task 3Task 4Task 5Task 6Task 7Task 8Task 9Task 10Task 1 SQL 缩写代表什么? Structured Query LanguageTask 2 最常见的 SQL 漏洞类型之一是什么? SQL injectionTask 3 此漏洞的 2021 年 OWASP Top 10 分类是什么?

scroll-view在小程序页面里实现滚动,uniapp项目

要实现红框中的区域进行滚动,scroll-view必须写高 <template><!-- 合同-待确认 --><view class"viewport"><!-- 上 --><view class"top-box"><!-- tab --><view class"tabs"><textv-for"(ite…

Alibaba-> EasyExcel 整理3

1 导入依赖 <!-- easyExcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version >3.2.1</version><exclusions><exclusion><artifactId>poi-ooxml-schemas</art…

css垂直水平居中的几种实现方式

垂直水平居中的几种实现方式 一、固定宽高&#xff1a; 1、定位 margin-top margin-left .box-container{position: relative;width: 300px;height: 300px;}.box-container .box {width: 200px; height: 100px;position: absolute; left: 50%; top: 50%;margin-top: -50px;…

what is BERT?

BERT Introduction Paper 参考博客 9781838821593_ColorImages.pdf (packt-cdn.com) Bidirectional Encoder Representation from Transformer 来自Transformer的双向编码器表征 基于上下文&#xff08;context-based&#xff09;的嵌入模型。 那么基于上下文&#xff08;…

【MySQL性能优化】- MySQL结构与SQL执行过程

MySQL结构与SQL执行过程 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正…

自然语言处理笔记

文章目录 情感词典中文分词 情感词典 英文的情感词典有&#xff1a;LIWC, SentiWordNet等 中文的情感词典有&#xff1a;NTUSD, 正文褒贬词典TSING, 知网HowNet等 中文分词 中文分词的工具有&#xff1a;jieba(核心算法是张华平的Nshort算法)&#xff0c; SnowNLP&#xff0…

开源了一款Vue3 Ts Vite4 uni-app 驱动的跨端快速启动模板

一、开源项目简介 由 Vue3 & Ts & Vite4 & uni-app 驱动的跨端快速启动模板。推荐使用 VSCode 编辑器开发&#xff0c;集成了 Prettier ESLint StyleLint husky lint-staged commitlint UnoCSS Vue3 TypeScript Vite4 setup&#xff0c;开箱即用。 二、…

【计算机组成原理】程序的转换及机器级表示 常用计算机术语英文缩写汇总

编码 二进制编码的十进制数&#xff08;BCD&#xff09;&#xff1a;Binary Coded Decimal美国信息交换标准代码&#xff08;ASCII&#xff09;&#xff1a;American Standard Code for Information Interchange 数据的排列顺序 最低有效位&#xff08;LSB&#xff09;&…

全链路追踪关键技术-TraceId、SpanId生成规则

链路追踪的traceid原理梳理 如何追踪微服务调用&#xff1f; ● traceId&#xff0c;用于标识某一次具体的请求ID。当用户的请求进入系统后&#xff0c;会在RPC调用网络的第一层生成一个全局唯一的traceId&#xff0c;并且会随着每一层的RPC调用&#xff0c;不断往后传递&…

day17 平衡二叉树 二叉树的所有路径 左叶子之和

题目1&#xff1a;110 平衡二叉树 题目链接&#xff1a;110 平衡二叉树 题意 判断二叉树是否为平衡二叉树&#xff08;每个节点的左右两个子树的高度差绝对值不超过1&#xff09; 递归遍历 递归三部曲 1&#xff09;确定递归函数的参数和返回值 2&#xff09;确定终止条…

uniapp小程序当页面内容超出时显示滚动条,不超出时不显示---样式自定义

使用scroll-view中的show-scrollbar属性 注意:需要搭配enhanced使用 否则无效 <scroll-view class"contentshow" scroll-y :show-scrollbartrue :enhancedtrue><view class"content" :show-scrollbartrue><text>{{vehicleCartinfo}}<…

【动态规划】LeetCode-42. 接雨水

42. 接雨水。 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1…

Quartus 软件界面介绍与部分使用技巧

内容太多&#xff0c;只能慢慢补充完善了~ 对一个软件的熟练掌握&#xff0c;不仅在于完成项目工程&#xff0c;还在于对一个软件的各个功能的位置与使用要熟稔于心&#xff08;个人看法&#xff09;。 软件界面 默认打开的软件界面如下&#xff1a; 关掉所有能关闭的窗口&am…

怎么安装IK分词器

.安装IK分词器 1.在线安装ik插件&#xff08;较慢&#xff09; # 进入容器内部 docker exec -it elasticsearch /bin/bash ​ # 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elastics…

学习笔记-数据容器:dict(字典)

一.字典的定义 1.语法 使用{ }存储原始&#xff0c;每一个元素是一个键值对每一个键值对包含Key和Value&#xff08;用冒号分隔&#xff09;键值对之间使用逗号分隔Key和Value可以是任意类型的数据&#xff08;key不可为可变类型(列表集合字典)&#xff09;Key不可重复&#…

LeetCode304. Range Sum Query 2D - Immutable

文章目录 一、题目二、题解 一、题目 Given a 2D matrix matrix, handle multiple queries of the following type: Calculate the sum of the elements of matrix inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2)…

蓝桥——第 3 场 小白入门赛(A-D)

文章目录 一、题目A.召唤神坤基本思路&#xff1a;代码 B.聪明的交换策略基本思路&#xff1a;代码 C.怪兽突击基本思路&#xff1a;代码 D.蓝桥快打基本思路代码 一、题目 A.召唤神坤 基本思路&#xff1a; 贪心&#xff0c; 使结果最大&#xff0c;希望两边w[i],w[k]是较大…

Oracle数据库 CentOS7上修改hostname后无法启动解决办法

目录 一、问题背景 二、解决问题 三、重启数据库 四、重启监听 一、问题背景 CentOS系统需要修改hostname&#xff0c;修改后oracle数据库无法启动和正常运行。 系统&#xff1a;CentOS7.3 数据库版本&#xff1a;Oracle 11g Express Edtion 二、解决问题 通过which orac…

提交代码,SVN被锁定,提示:svn is already locked解决方案

今天遇到一个问题&#xff0c;svn 在提交代码的时候出现了svn is already locked&#xff0c;解决方案如下图 点击clean up 点击ok即可 来看官方对clean up的解释&#xff1a;它的作用就是查找工作拷贝中的所有遗留的日志文件&#xff0c;删除进程中工作拷贝的锁。 参考&…