JDK源码阅读-------自学笔记(八)(数组演示冒泡排序和二分查找)
冒泡排序
算法
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数
- 针对所有的元素重复以上的步骤,除了最后一个
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
实例
1 public static void main(String[] args) {
2
3
4 // 初始化数组并赋值
5 int[] values = {6, 1, 3, 2, 9, 0, 7, 4, 5, 8};
6
7 // 进行从小到大排序
8 bubbleSort(values);
9
10 // 打印排序后结果
11 System.out.println(Arrays.toString(values));
12
13 }
14
15
16 /**
17 * 冒泡排序
18 *
19 * @param values 传入的排序数组
20 */
21 private static void bubbleSort(int[] values) {
22
23 int temp;
24
25 for (int i = 0; i < values.length; i++) {
26 for (int j = 0; j < values.length - 1 - i; j++) {
27 if (values[j] > values[j + 1]) {
28 temp = values[j];
29 values[j] = values[j + 1];
30 values[j + 1] = temp;
31 }
32 }
33 }
34 }
存在问题
- 当数组数据本身有序的时候,走遍历就会很浪费资源
- 初始化状态下,有序数列是空的
- 判断每一趟是否发生了数组元素的交换,如果没有发生,则说明此时数组已经有序,无需再进行后续趟数的比较了。此时可以中止比较
优化
- 添加标识位判别
1 // 初始化数组并赋值
2 int[] values = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
3
4 // 进行从小到大排序
5 bubbleSort(values);
6
7 // 打印排序后结果
8 System.out.println(Arrays.toString(values));
9
10 }
11
12
13 /**
14 * 冒泡排序
15 *
16 * @param values 传入的排序数组
17 */
18 private static void bubbleSort(int[] values) {
19
20 int temp;
21
22 for (int i = 0; i < values.length; i++) {
23
24 // 定义一个布尔类型的变量,标记数组是否已达到有序状态
25 boolean flag = true;
26 for (int j = 0; j < values.length - 1 - i; j++) {
27 if (values[j] > values[j + 1]) {
28 temp = values[j];
29 values[j] = values[j + 1];
30 values[j + 1] = temp;
31
32 //本趟发生了交换,表明该数组在本趟处于无序状态,需要继续比较;
33 flag = false;
34 }
35 }
36
37 //根据标记量的值判断数组是否有序,如果有序,则退出;无序,则继续循环。
38 if (flag) {
39 break;
40 }
41
42 }
43 }
二分查找
算法
- 设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值key与数组中间位置上元素的关键码(key)比较,如果相等,则检索成功
- 否则,若key小,则在数组前半部分中继续进行二分法检索
- 若key大,则在数组后半部分中继续进行二分法检索
- 这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败
实例
1 public static void main(String[] args) {
2
3 int[] arr = {30, 20, 50, 10, 80, 9, 7, 12, 100, 40, 8};
4 // 所要查找的数
5 int searchWord = 20;
6 //二分法查找之前,一定要对数组元素排序
7 Arrays.sort(arr);
8 System.out.println(Arrays.toString(arr));
9 System.out.println(searchWord + "元素的索引:" + binarySearch(arr, searchWord));
10
11 }
12
13
14 /**
15 * 二分查找
16 *
17 * @param array 传入数组
18 * @param value 角标位置
19 * @return 查到的数据 位置
20 */
21 public static int binarySearch(int[] array, int value) {
22 int low = 0;
23 int high = array.length - 1;
24 while (low <= high) {
25 int middle = (low + high) / 2;
26 if (value == array[middle]) {
27
28 //返回查询到的索引位置
29 return middle;
30 }
31 if (value > array[middle]) {
32 low = middle + 1;
33 }
34 if (value < array[middle]) {
35 high = middle - 1;
36 }
37 }
38
39 //上面循环完毕,说明未找到,返回-1
40 return -1;
41 }
JDK源码阅读-------自学笔记(八)(数组演示冒泡排序和二分查找)的更多相关文章
- JDK源码阅读-------自学笔记(一)(java.lang.Object重写toString源码)
一.前景提要 Object类中定义有public String toString()方法,其返回值是 String 类型. 二.默认返回组成 类名+@+16进制的hashcode,当使用打印方法打印的 ...
- JDK源码阅读-------自学笔记(五)(浅析数组)
一.数组基础 1.定义和特点 数组也可以看做是对象,数组变量属于引用类型,数组中每个元素相当于该队形的成员变量,数组对象存储在堆中. 2.初始化数组 常用类初始化 // 整型初始化 int[] int ...
- JDK源码阅读-------自学笔记(二十五)(java.util.Vector 自定义讲解)
Vector 向量 Vector简述 1).Vector底层是用数组实现的List 2).虽然线程安全,但是效率低,所以并不是安全就是好的 3).底层大量方法添加synchronized同步标记,sy ...
- JDK源码阅读-------自学笔记(二十四)(java.util.LinkedList 再探 自定义讲解)
一.实现get方法 1.一般思维实现思路 1).将对象的值放入一个中间变量中. 2).遍历索引值,将中间量的下一个元素赋值给中间量. 3).返回中间量中的元素值. 4).示意图 get(2),传入角标 ...
- JDK源码阅读(三):ArraryList源码解析
今天来看一下ArrayList的源码 目录 介绍 继承结构 属性 构造方法 add方法 remove方法 修改方法 获取元素 size()方法 isEmpty方法 clear方法 循环数组 1.介绍 ...
- JDK源码阅读(一):Object源码分析
最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 has ...
- JDK源码阅读-FileOutputStream
本文转载自JDK源码阅读-FileOutputStream 导语 FileOutputStream用户打开文件并获取输出流. 打开文件 public FileOutputStream(File fil ...
- JDK源码阅读-FileInputStream
本文转载自JDK源码阅读-FileInputStream 导语 FileIntputStream用于打开一个文件并获取输入流. 打开文件 我们来看看FileIntputStream打开文件时,做了什么 ...
- JDK源码阅读-ByteBuffer
本文转载自JDK源码阅读-ByteBuffer 导语 Buffer是Java NIO中对于缓冲区的封装.在Java BIO中,所有的读写API,都是直接使用byte数组作为缓冲区的,简单直接.但是在J ...
- JDK源码阅读-DirectByteBuffer
本文转载自JDK源码阅读-DirectByteBuffer 导语 在文章JDK源码阅读-ByteBuffer中,我们学习了ByteBuffer的设计.但是他是一个抽象类,真正的实现分为两类:HeapB ...
随机推荐
- #主席树,并查集#CodeChef Sereja and Ballons
SEABAL 分析 考虑用并查集维护当前连续被打破的气球段,那么每次新增的区间就是 \([l_{x-1},x]\) 到 \([x,r_{x+1}]\) 的连接. 只要 \(l,r\) 分别满足在这之间 ...
- Go 语言注释教程
注释是在执行时被忽略的文本.注释可用于解释代码,使其更易读.注释还可用于在测试替代代码时防止代码执行.Go支持单行或多行注释. Go单行注释 单行注释以两个正斜杠(//)开头. 在//和行尾之间的任何 ...
- configparser封装后报错:configparser.NoSectionError: No section: 'LoginElement'
前言 这是目录结构 先贴一下源代码 # read_ini.pyimport configparser class ReadIni(): """读取 ini.ini 配置文 ...
- 教你构建一个优秀的SD Prompt
构建一个优秀的Prompt 在使用Stable Diffusion AI时,构建一个有效的提示(Prompt)是至关重要的第一步.这个过程涉及到创造性的尝试和对AI行为的理解.这里我会对如何构建一个好 ...
- 在python中通过面向对象方式,实现烤地瓜案例
例子:烤地瓜,不同时间,反馈不同状态,并给不同状态地瓜加入不同味道 烤地瓜时间 0-3分钟,生的 4-7分钟,半生不熟的 8-12分钟,熟了 12分钟以上,已烤熟,糊了 用户可以按自己的意思添加调料 ...
- Launching Teamviewer remotely through SSH
Launching Teamviewer remotely through SSH When you need to manage your Server remotely, but you can ...
- mongodb基础整理篇————副本原理篇[外篇]
前言 简单介绍一下副本集的原理篇. 正文 下面是几个基本的原理: 副本之间是如何复制的? mongodb 实现此功能的方式是保存操作日志,其中包含了主节点执行的每一次操作,这和mysql比较像. op ...
- jenkins 持续集成和交付 —— 触发器(六)
前言 什么是触发器呢?当某种条件达到的时候将会触发某个机关. 正文 jenkins 内置4种触发器: 1.触发远程构建 2.其他工程构建后触发 3.定时触发 4.轮询SCM 那么就来介绍一下这几种吧. ...
- 国内chatGPT中文版网站有哪些?国内人工智能百花齐放!该如何选择?
人工智能技术在中国的快速发展和普及,使得国内的人工智能产业日益壮大.在这些领域中,自然语言处理技术和聊天机器人已经取得了显著的进展.ChatGPT作为一种基于深度学习的聊天机器人模型,在国内得到了广泛 ...
- 【Oracle】力扣简单的练习题
Oracle力扣简单的练习题 请你编写一个 SQL 查询来交换所有的 'f' 和 'm' /* Write your PL/SQL query statement below */ /******** ...