【Java基础】数组和算法
数组和算法
查找算法
线性查找
...
二分查找
二分查找要求数据结构是有序的。
package com.parzulpan.java.ch03;
/**
* @Author : parzulpan
* @Time : 2020-11-17
* @Desc : 二分查找
*/
public class BinaryFind {
public static boolean binaryFind(int[] arr, int number) {
boolean isFlag = false;
int start = 0, end = arr.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (arr[mid] == number) {
isFlag = true;
break;
} else if (arr[mid] > number) {
end = mid - 1;
} else {
start = mid + 1;
}
}
return isFlag;
}
public static void main(String[] args) {
int[] arr = new int[]{-99, -54, -2, 0, 2, 33, 43, 256, 999};
System.out.println(binaryFind(arr, 256));
System.out.println(binaryFind(arr, 1342));
}
}
排序算法
排序:假设含有 n 个记录的序列为 {R1,R2,...,Rn},其相应的关键字序列为 {K1,K2,...,Kn}。将这些记录重新排序为 {Ri1,Ri2,...,Rin},使得相应的关键字值满足条 Ki1<=Ki2<=...<=Kin,这样的一种操作称为排序。
通常来说,排序的目的是快速查找。
衡量排序算法的优劣:
- 时间复杂度:分析关键字的比较次数和记录的移动次数;
- 空间复杂度:分析排序算法中需要多少辅助内存;
- 稳定性:若两个记录 A 和 B 的关键字值相等,但排序后 A、B 的先后次序保持不变,则称这种排序算法是稳定的。
排序算法分类:
- 内部排序:整个排序过程不需要借助于外部存储器(如磁盘等),所有排序操作都在内存中完成;
- 外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助于外部存储器(如磁盘)。外部排序最常见的是多路归并排序。可以认为外部排序是由多次内部排序组成。
内部排序算法:
- 选择排序:直接选择排序、堆排序;
- 交换排序:冒泡排序、快速排序;
- 插入排序:直接插入排序、折半插入排序、希尔排序;
- 归并排序;
- 桶排序;
- 基数排序。
其中,快速排序、直接选择排序、希尔排序和堆排序是不稳定排序。
!待更新
排序算法性能对比:
| 排序方法 | 平均时间复杂度 | 平均时间复杂度 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
|---|---|---|---|---|---|
| 直接选择排序 | O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
不稳定 |
| 堆排序 | O(nlog2n) |
O(nlog2n) |
O(nlog2n) |
O(1) |
不稳定 |
| 冒泡排序 | O(n^2) |
O(n^2) |
O(n) |
O(1) |
稳定 |
| 快速排序 | O(nlog2n) |
O(n^2) |
O(nlog2n) |
O(nlog2n) |
不稳定 |
| 直接插入排序 | O(n^2) |
O(n^2) |
O(n) |
O(1) |
稳定 |
| 直接选择排序 | O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
不稳定 |
| 直接选择排序 | O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
不稳定 |
| 直接选择排序 | O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
不稳定 |
| 直接选择排序 | O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
不稳定 |
| 直接选择排序 | O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
不稳定 |
排序算法性能比较:
排序算法的选择:
Arrays 工具类
java.util.Arrays 类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。
常见方法:
| 方法 | 说明 |
|---|---|
boolean equals(int[] a,int[] b) |
判断两个数组是否相等。 |
String toString(int[] a) |
输出数组信息。 |
void fill(int[] a,int val) |
将指定值填充到数组之中。 |
void sort(int[] a) |
对数组进行排序。 |
int binarySearch(int[] a,int key) |
对排序后的数组进行二分法检索指定的值。 |
package com.parzulpan.java.ch03;
import java.util.Arrays;
/**
* @Author : parzulpan
* @Time : 2020-11-17
* @Desc : Arrays 工具类的常用方法
*/
public class ArraysTest {
public static void main(String[] args) {
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = new int[]{1, 3, 2, 4};
System.out.println(Arrays.equals(arr1, arr2));
System.out.println(Arrays.toString(arr1));
int[] arr3 = new int[]{1, 2, 3, 4};
Arrays.fill(arr3, 10);
System.out.println(Arrays.toString(arr3));
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));
int[] arr4 = new int[]{-99, -54, -2, 0, 2, 33, 43, 256, 999};
int index = Arrays.binarySearch(arr4, 239);
if (index < 0) {
System.out.println("arr4 中不存在 " + 239);
}
}
}
练习和总结
!待更新
【Java基础】数组和算法的更多相关文章
- Java基础——数组应用之StringBuilder类和StringBuffer类
接上文:Java基础——数组应用之字符串String类 一.StringBuffer类 StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和 ...
- java基础-数组的折半查找原理
java基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...
- Java基础-数组常见排序方式
Java基础-数组常见排序方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数据的排序一般都是生序排序,即元素从小到大排列.常见的有两种排序方式:选择排序和冒泡排序.选择排序的特 ...
- 《Java基础——数组的定义与使用》
Java基础--数组的定义与使用 一. 一维数组: 格式一: 数组类型 数组变量[]=new 数据类型[长度]; //需要后续赋值,且后续赋值时只能为单个元素赋值. 或 数组类型 数组变量 ...
- Java基础——数组Array
一.数组基本概念 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 数组有三 ...
- Java基础--数组(Arrays)
数组(Array),是多个相同类型数据按一定顺序排列 的集合,并使用一个名字命名,并通过编号的方式 对这些数据进行统一管理.本篇博客是对Java基础中的数组进行详细说明. 目录: 数组的概述 一维数组 ...
- java基础---数组的基本概念(1)
学习资源来自尚硅谷java基础学习 1. 数组的概念 数组(Array), 是多个相同类型数据按一定顺序排列的集合, 并使用一个名字命名, 并通过编号的方式对这些数据进行统一管理. 数组属于引用数据类 ...
- JAVA基础——数组详解
学习JAVA中数组的使用 一.什么是数组? 问:编写代码保存 4 名学生的考试成绩. 答:简单啊,定义 4 个变量呗 问:那"计算全年级 400 名学生的考试成绩",肿么办 答: ...
- Java基础——数组复习
数组是一个变量,存储相同数据类型的一组数据 声明一个变量就是在内存空间划出一块合适的空间 声明一个数组就是在内存空间划出一串连续的空间 数组长度固定不变,避免数组越界 数组是静态分配内存空间的,所 ...
- java基础---数组的排序算法(3)
一.排序的基本概念 排序:将一个数据元素集合或序列重新排列成按一个数据元素某个数据项值有序的序列 稳定排序:排序前和排序后相同元素的位置关系与初始序列位置一致(针对重复元素来说,相对位置不变) 不稳定 ...
随机推荐
- 云服务器 ECS Linux 安装 VNC Server 实现图形化访问配置说明
阿里云官方公共 Linux 系统镜像,基于性能及通用性等因素考虑,默认没有安装 VNC 服务组件.本文对常见操作系统下的 VNC Server 安装配置进行简要说明. 本文中仅讨论VNC的安装,关于图 ...
- Consul安装部署(Windows单机、Docker集群)
1. Consul简介 Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发,基于 Mozilla Public Licen ...
- jQuery的事件机制和其他知识
jQuery 设置宽度和高度 宽度操作: $(selector).height(); //不带参数表示获取高度 $(selector).height(200); //带参数表示设置高度 宽度操作: ...
- 某毒霸网站存在信息泄露和sql注入
通过钟馗之眼搜索目标网站的证书使用者找到信息泄露的网站, 点击上图中的edit会跳转 手工注入sql发现有效 that's all
- 图解JanusGraph系列 - JanusGraph指标监控报警(Monitoring JanusGraph)
大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 整理所有图相关文章,请移步(超链):图数据库系列-文章总目录 源码分析相关可查看github(码文不易,求个sta ...
- SecureCRT的下载、安装和Putty 的使用 SSH连接工具
SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件.SecureCRT支持SSH,同时支持Telnet和rlog ...
- JIRA 知多少:聊一聊 Android Studio 、工作流相关设置
Android Studio 相关 配置 JIRA 服务器 如果细心的话会发现有一个选项卡:Commit Message.这一段代码是不是有点熟悉呢?你没有猜错,这段代码就是 commit 模板,当你 ...
- 线程 - AtomicInteger
原理 AtomicInteger是如何使用非阻塞算法来实现并发控制的 性能提升 避免多线程的优先级倒置和死锁情况的发生 任然可能存在问题 ABA问题 CAS原理 调整具有竞争的并发应用程序的可伸缩性的 ...
- mysql存储过程定义者
1. 执行update mysql.proc set DEFINER='root@%' WHERE NAME='p_update_rim_batch_log' AND db='otherdataonl ...
- JDBC数据库删除
1 //删除操作: 2 3 if(conn != null){ 4 String temps="2"; 5 conn.setAutoCommit(false); 6 Prepare ...