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 ...
随机推荐
- #线段树,组合计数,二项式定理#CF266E More Queries to Array
洛谷传送门 CF266E传送门 分析 首先区间修改区间查询首选线段树 要找突破口,\((i-l+1)^k\)中\(i\)不是定值, 显然得拆开,而且\(k\)很小,根据二项式定理, \[\sum_{i ...
- 鸿蒙手表定位功能Demo体验,适用儿童、老年和外出旅游安全市场
针对儿童和老人,可穿戴的智能手表用处很大.市场也有许多类似的产品,支持接打电话.支付扫码.定位等功能,属于新兴的商业机会.依托华为品牌,鸿蒙手表也致力为用户打造精品的.产品质量佳.可穿戴的智能体验.对 ...
- C++执行Linux命令
一.执行简单命令 比如需要创建文件.文件夹.删除文件 #include <iostream> #include <stdio.h> #include <stdlib.h& ...
- 动态库 DLL 封装四:对dll二次封装,开放回调函数,并减少回调函数中参数个数
背景: 我需要对一个dll进行二次封装,其中有一个接口,里面的参数需要传回调函数. 需求: 这个回调函数,我需要开放出去,并且减少回调函数参数的个数 示例: // 回调原型 VOID __stdcal ...
- GAN的一些问题
GAN为什么难以训练? 大多深度模型的训练都使用优化算法寻找损失函数比较低的值.优化算法通常是个可靠的"下山"过程.生成对抗神经网络要求双方在博弈的过程中达到势均力敌(均衡).每个 ...
- 重新整理 mysql 基础篇—————表锁和全局锁[六]
前言 锁从大的方面可以分为: 1.全局锁 2.表锁 3.行锁 正文 全局锁 全局锁就是对整个数据加上读锁. 在mysql 中,加入全局锁的命令就是: Flush tables with read lo ...
- c# 泛型原理(旧)
前言 说起泛型可能很多人刚才看到的时候肯定会说牛逼啊,厉害啊,这东西少写了不少代码,我总结了泛型的一个优点,那就是少写代码,额,专业点吧. 优点:增加代码的重复利用率,代码重用. 先不讲原理吧,来讲下 ...
- c# unsafe
前言 c# unsafe可以让我们做一些测试的危险操作. 正文 打开unsafe 功能 在 Visual Studio 开发环境中设置此编译器选项 打开项目的"属性"页. 单击&q ...
- 使用electron的demo时遇到的错误
使用electron的demo时的错误 Electron | Build cross-platform desktop apps with JavaScript, HTML, and CSS. (el ...
- 力扣176(MySQL)-第二高的薪水(中等)
题目: id 是这个表的主键.表的每一行包含员工的工资信息. 编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 .如果不存在第二高的薪水,查询应该返回 null . 查询结果如下 ...