冒泡排序

算法

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数
  • 针对所有的元素重复以上的步骤,除了最后一个
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

实例

 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源码阅读-------自学笔记(八)(数组演示冒泡排序和二分查找)的更多相关文章

  1. JDK源码阅读-------自学笔记(一)(java.lang.Object重写toString源码)

    一.前景提要 Object类中定义有public String toString()方法,其返回值是 String 类型. 二.默认返回组成 类名+@+16进制的hashcode,当使用打印方法打印的 ...

  2. JDK源码阅读-------自学笔记(五)(浅析数组)

    一.数组基础 1.定义和特点 数组也可以看做是对象,数组变量属于引用类型,数组中每个元素相当于该队形的成员变量,数组对象存储在堆中. 2.初始化数组 常用类初始化 // 整型初始化 int[] int ...

  3. JDK源码阅读-------自学笔记(二十五)(java.util.Vector 自定义讲解)

    Vector 向量 Vector简述 1).Vector底层是用数组实现的List 2).虽然线程安全,但是效率低,所以并不是安全就是好的 3).底层大量方法添加synchronized同步标记,sy ...

  4. JDK源码阅读-------自学笔记(二十四)(java.util.LinkedList 再探 自定义讲解)

    一.实现get方法 1.一般思维实现思路 1).将对象的值放入一个中间变量中. 2).遍历索引值,将中间量的下一个元素赋值给中间量. 3).返回中间量中的元素值. 4).示意图 get(2),传入角标 ...

  5. JDK源码阅读(三):ArraryList源码解析

    今天来看一下ArrayList的源码 目录 介绍 继承结构 属性 构造方法 add方法 remove方法 修改方法 获取元素 size()方法 isEmpty方法 clear方法 循环数组 1.介绍 ...

  6. JDK源码阅读(一):Object源码分析

    最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 has ...

  7. JDK源码阅读-FileOutputStream

    本文转载自JDK源码阅读-FileOutputStream 导语 FileOutputStream用户打开文件并获取输出流. 打开文件 public FileOutputStream(File fil ...

  8. JDK源码阅读-FileInputStream

    本文转载自JDK源码阅读-FileInputStream 导语 FileIntputStream用于打开一个文件并获取输入流. 打开文件 我们来看看FileIntputStream打开文件时,做了什么 ...

  9. JDK源码阅读-ByteBuffer

    本文转载自JDK源码阅读-ByteBuffer 导语 Buffer是Java NIO中对于缓冲区的封装.在Java BIO中,所有的读写API,都是直接使用byte数组作为缓冲区的,简单直接.但是在J ...

  10. JDK源码阅读-DirectByteBuffer

    本文转载自JDK源码阅读-DirectByteBuffer 导语 在文章JDK源码阅读-ByteBuffer中,我们学习了ByteBuffer的设计.但是他是一个抽象类,真正的实现分为两类:HeapB ...

随机推荐

  1. 使用OHOS SDK构建flac

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone --depth=1 https://github.com/xiph/flac 进入 ...

  2. Web服务器启用HTTPS的配置方法

    本文于2016年3月完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. nginx的配置方法 可以参考Jerry Qu的本博客 Nginx 配 ...

  3. 一文弄懂String的所有小秘密

    目录 简介 String是不可变的 传值还是传引用 substring() 导致的内存泄露 总结 简介 String是java中非常常用的一个对象类型.可以说java中使用最多的就是String了.那 ...

  4. MySQL 主从 AUTO_INCREMENT 不一致问题分析

    作者:vivo 互联网数据库团队 - Wei Haodong 本文介绍了 MySQL5.7 中常见的replace into 操作造成的主从auto_increment不一致现象,一旦触发了主从切换, ...

  5. 响应式系统与 React

    0x1 React 的历史与应用 应用场景 前端应用开发,如 Meta.Ins.Netflix 的网页版 移动原生应用开发,如 Ins.Discord 结合 Electron 进行桌面应用开发 发展历 ...

  6. Vue保持用户登录状态(各种token存储方式)

    目录 怎么设置Cookie Cookie的缺点: LocalStorage与SessionStorage存储Token LocalStorage与SessionStorage的主要区别: Vuex存储 ...

  7. http协议重新整理——————历史[一]

    前言 简单整理一些http协议. 正文 20 世纪 60 年代,美国国防部高等研究计划署(ARPA)建立了 ARPA 网,它有四个分布在各地的节点,被认为是如今互联网的"始祖". ...

  8. https http2 http3

    HTTP 1.1 对比 1.0,HTTP 1.1 主要区别主要体现在: 缓存处理:在 HTTP 1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判 ...

  9. java知识点查漏补缺-- 2020513

    重载和重写 方法重载(overload): 必须是同一个类 方法名(也可以叫函数)一样 参数类型不一样或参数数量不一样 方法的重写(override)两同两小一大原则: 方法名相同,参数类型相同 子类 ...

  10. 简单介绍 Vue 3.0 项目创建

    一.前期转杯 确保电脑上已安装 node.js. 可通过命令 npm --version进行查询,如果展示了版本号,则说明已安装,若提示 npm 不是有内部或外部命令,也不是可运行的程序,则说明未安装 ...