2018-10-29 20:16:46


冒泡排序

例子(对数字排序):

假设有这样一组数字:32, 8, 128, 2, 64

现在对其进行冒泡排序(*表示下次比较的开始数字):

32>8? ture: 将32和8调换位置  8, 32*, 128, 2, 64;

32>128? false:保持原位置不动   8, 32, 128*, 2, 64;

128>2 ? true: 将128和2调换位置  8, 32, 2, 128*, 64;

128>64 ? true:将128和64调换位置  8, 32, 2, 64, 128*;

经过以上步骤,最大数128浮出水面。

现在找出剩余数字 8, 32, 2, 64 中的最大数:

8>32? false: 保持原位置不动 8, 32*, 2, 64;

32>2 ? ture: 将32和2调换位置  8, 2, 32*, 64;

32>64? false: 保持原位置不动   8, 2, 32, 64*;

经过以上步骤,最大数64浮出水面。

...

由此一步步比较,即可得到排序后的结果: 2, 8, 32, 64, 128

程序实现如下:

//形式参数intArr表示要排序的数组

     public static int[] bubbleSort(int[] intArr) {
         if (intArr == null)
             return null; // 当传进来的数组为null时返回null
         int len = intArr.length; // 定义len表示数组的长度
         if (len < 2)
             return intArr; // 当数组长度小于2时直接返回该数组,此时无需排序

         while (len > 1) {
             for (int i = 0; i < len - 1; i++) {
                 // if语句表示如果前一个数大于后一个数,则交换位置,否则什么也不做
                 if (intArr[i] > intArr[i + 1]) {
                     int temp = intArr[i];
                     intArr[i] = intArr[i + 1];
                     intArr[i + 1] = temp;
                 }
             }
             len -= 1; // 经过一个循环的比较,已经得出了本次循环的最大值,把它放在索引最大处,接下来比较除最大索引处之外的数的最大值,依次循环...
         }
         return intArr;
     }

二分查找

例子(对上述排序好的数字进行查找):

有如下排序好的数字:2, 8, 32, 64, 128

索引值分别为 0, 1, 2, 3, 4

如何查找数字 2 的索引呢?

取中间索引 2 处的值 32 , 32<2 ? false,说明数值2的索引在索引2的前面;

取索引0和索引2的中间索引值1,索引1处的值为8, 8<2 ? false,说明数值2的索引在索引1的前面;

...

依次取值比较即可得到数值2的索引为1;

程序实现如下:

参数表示在数组intArr中查找值value所在的索引

     public static int binarySearch(int value, int[] intArr) {
         int low = 0; // low表示最小索引
         int high = intArr.length - 1; // len表示最大索引

         while (high >= low) {
             // 0 1 2 3 4 5 中间索引指2;
             // 0 1 2 3 4 中间索引则为2
             int mid = (low+high) >>> 1; // mid表示len无符号右移一位,最高位补0,即除以2
             int midVal = intArr[mid]; // midVal表示数组中间索引处值

             if (midVal < value)
                 low = mid + 1;
             else if (midVal > value)
                 high = mid - 1;
             else
                 return mid; // 当要查找的值找到时返回其索引
         }
         return -1; // 当要查找的值未找到时返回-1
     }

Java:冒泡排序 | 二分查找的更多相关文章

  1. java 冒泡排序 二分查找 选择排序 插入排序

    下面这个程序是先定义一个整型数组,然后将其中的元素反序赋值,再用冒泡排序进行排序以后用二分查找来查找其中是否有某个数,返回值为-1时表示这个数可能小于这个数组的最小值或大小这个数组的最大值,-2表示这 ...

  2. 学习练习 Java冒泡排序 二分查找法

    冒泡排序: // 冒泡排序 /* System.out.println("请输入要排序的个数:"); Scanner v = new Scanner(System.in); int ...

  3. [19/03/13-星期三] 数组_二维数组&冒泡排序&二分查找

    一.二维数组 多维数组可以看成以数组为元素的数组.可以有二维.三维.甚至更多维数组,但是实际开发中用的非常少.最多到二维数组(我们一般使用容器代替,二维数组用的都很少). [代码示例] import ...

  4. Java实现二分查找算法

    Java程序员总该玩点基本的算法. 1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中 ...

  5. 【15】-java实现二分查找

    二分查找在面试中经常被遇到,这个方法十分优雅 介绍 二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它.一开始,范围覆盖整个数组 ...

  6. 手把手教你用java实现二分查找树及其相关操作

    二分查找树(Binary Search Tree)的基本操作有搜索.求最大值.求最小值.求前继.求后继.插入及删除. 对二分查找树的进行基本操作所花费的时间与树的高度成比例.例如有n个节点的完全二叉树 ...

  7. java实现二分查找

    /** * 二分查找 * @param a * @param n * @param value * @return * @date 2016-10-8 * @author shaobn */ publ ...

  8. java 实现二分查找法

    /** * 二分查找又称折半查找,它是一种效率较高的查找方法. [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. * @author Administrator * */ p ...

  9. Java算法 -- 二分查找

    折半查找,要求待查找的序列有序.每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程.直到 ...

随机推荐

  1. Ubuntu下Zabbix服务器监控工具部署

    Ubuntu下Zabbix服务器监控工具部署 一 安装安装Apache.Mysql.Php.zabbix sudo apt-get update sudo apt-get install apache ...

  2. Ubuntu 16.04下安装MacBuntu 16.04 TP 变身Mac OS X主题风格

    Ubuntu 16.04下安装MacBuntu 16.04 TP 变身Mac OS X主题风格 sudo add-apt-repository ppa:noobslab/macbuntu sudo a ...

  3. mipi差分信号原理

    差分信号,什么是差分信号 一个差分信号是用一个数值来表示两个物理量之间的差异.从严格意义上来讲,所有电压信号都是差分的,因为一个电压只能是相对于另一个电压而言的.在某些系统里,系统’地’被用作电压基准 ...

  4. vue项目开发中踩过的坑

    一.路由 这两天移动端的同事在研究vue,跟我说看着我的项目做的,子路由访问的时候是空白的,我第一反应是,不会模块没加载进来吧,还是....此处省略一千字... 废话不多说上代码 路由代码 { pat ...

  5. nginx 多进程 + io多路复用 实现高并发

    一.nginx 高并发原理 简单介绍:nginx 采用的是多进程(单线程) + io多路复用(epoll)模型 实现高并发 二.nginx 多进程 启动nginx 解析初始化配置文件后会 创建(for ...

  6. Java多线程(九) synchronized 锁对象的改变

    public class MyService { private String lock = "123"; public void testMethod() { synchroni ...

  7. [C陷阱和缺陷] 第6章 预处理器

      在严格意义上的编译过程开始之前,C语言预处理器首先对程序代码作了必要的转换处理.因此,我们运行的程序实际上并不是我们所写的程序.预处理器使得编程者可以简化某些工作,它的重要性可以由两个主要的原因说 ...

  8. [C和指针] 6-指针

    6.1 内存和地址 我们可以把计算机的内存看作是一条长街上的一排房屋,每座房子都可以容纳数据,并通过一个房号来标识. 这个比喻颇为有用,但也存在局限性.计算机的内存由以亿万计的位(bit)组成,每个位 ...

  9. 372 Super Pow 超级次方

    你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出.示例 1:a = 2b = [3]结果: 8示例 2:a = 2b = [1,0]结果: 102 ...

  10. Jax

    The scope of this project is to automate the current Credit Correction process of opening, editing, ...