冒泡排序

算法

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

实例

 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. #线段树,组合计数,二项式定理#CF266E More Queries to Array

    洛谷传送门 CF266E传送门 分析 首先区间修改区间查询首选线段树 要找突破口,\((i-l+1)^k\)中\(i\)不是定值, 显然得拆开,而且\(k\)很小,根据二项式定理, \[\sum_{i ...

  2. 鸿蒙手表定位功能Demo体验,适用儿童、老年和外出旅游安全市场

    针对儿童和老人,可穿戴的智能手表用处很大.市场也有许多类似的产品,支持接打电话.支付扫码.定位等功能,属于新兴的商业机会.依托华为品牌,鸿蒙手表也致力为用户打造精品的.产品质量佳.可穿戴的智能体验.对 ...

  3. C++执行Linux命令

    一.执行简单命令 比如需要创建文件.文件夹.删除文件 #include <iostream> #include <stdio.h> #include <stdlib.h& ...

  4. 动态库 DLL 封装四:对dll二次封装,开放回调函数,并减少回调函数中参数个数

    背景: 我需要对一个dll进行二次封装,其中有一个接口,里面的参数需要传回调函数. 需求: 这个回调函数,我需要开放出去,并且减少回调函数参数的个数 示例: // 回调原型 VOID __stdcal ...

  5. GAN的一些问题

    GAN为什么难以训练? 大多深度模型的训练都使用优化算法寻找损失函数比较低的值.优化算法通常是个可靠的"下山"过程.生成对抗神经网络要求双方在博弈的过程中达到势均力敌(均衡).每个 ...

  6. 重新整理 mysql 基础篇—————表锁和全局锁[六]

    前言 锁从大的方面可以分为: 1.全局锁 2.表锁 3.行锁 正文 全局锁 全局锁就是对整个数据加上读锁. 在mysql 中,加入全局锁的命令就是: Flush tables with read lo ...

  7. c# 泛型原理(旧)

    前言 说起泛型可能很多人刚才看到的时候肯定会说牛逼啊,厉害啊,这东西少写了不少代码,我总结了泛型的一个优点,那就是少写代码,额,专业点吧. 优点:增加代码的重复利用率,代码重用. 先不讲原理吧,来讲下 ...

  8. c# unsafe

    前言 c# unsafe可以让我们做一些测试的危险操作. 正文 打开unsafe 功能 在 Visual Studio 开发环境中设置此编译器选项 打开项目的"属性"页. 单击&q ...

  9. 使用electron的demo时遇到的错误

    使用electron的demo时的错误 Electron | Build cross-platform desktop apps with JavaScript, HTML, and CSS. (el ...

  10. 力扣176(MySQL)-第二高的薪水(中等)

    题目: id 是这个表的主键.表的每一行包含员工的工资信息. 编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 .如果不存在第二高的薪水,查询应该返回 null . 查询结果如下 ...