JAVA冒泡排序和二分查找的实现

所属分类: 软件编程 / java 阅读数: 39
收藏 0 赞 0 分享

冒泡排序 

冒泡排序(Bubble Sort),看到这种算法,我就想起一句话“小数上浮,大数下沉”,通过层层的比较使小数浮出水面,而使大数“石沉水底”。从而达到排序的效果。冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序算法的运作如下:

1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3. 针对所有的元素重复以上的步骤,除了最后一个。

4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序的过程图:

实例代码

public class BubbleSort{

  public static int[] bubbleSort(int[] array){
    for(int i = 0;i < array.length;i++){                      
      for(int j = 0; j < array.length-i-1;j++){
        if(array[j] > array[j+1]){            
          int temp = array[j]; 
          array[j] = array[j+1]; 
          array[j+1] = temp;  
        }
      }
      System.out.println("第"+(i+1)+"趟排序");
      for(int k = 0;k < array.length;k++){
        System.out.print(array[k]+" ");
      }
      System.out.println();
    }
    return array;
  }


  /**
   * @param args
   */
  public static void main(String[] args){
    int[] array = {7,3,9,5,6,8,1};
    bubbleSort(array);
  }

}

打印结果:

第1趟排序

3 7 5 6 8 1 9

第2趟排序

3 5 6 7 1 8 9

第3趟排序

3 5 6 1 7 8 9

第4趟排序

3 5 1 6 7 8 9

第5趟排序

3 1 5 6 7 8 9

第6趟排序

1 3 5 6 7 8 9

第7趟排序

1 3 5 6 7 8 9

二分查找

排好顺序了,也需要我们查找我们想要的数据了,而二分法查找就是其中常用的,节时的,基础的一种算法。二分查找就是从排序好数据的中间位置进行查找比较,类似于木棒的中间对砍,所以又叫折半查找,它是一种效率较高的查找方法。

【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。

【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。

重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

【算法复杂度】假设其数组长度为n,其算法复杂度为o(log(n)),最坏情况下的时间复杂度是O(n)。

实例代码

package com.somnus.array;
/**
 * 二分查找法
 * @author Compaq
 *
 */
public class BinarySearch{
  public static int binarySearch(int[] array, int value){
    int low = 0;
    int high = array.length-1;
    int middle = 0;
    while(low <= high){
      middle = (low+high)/2;//0 6  4 6  6 6
      for(int i = 0;i < array.length;i++){
        System.out.print(array[i]+" ");
        if(i == middle)//3 5 6 紧随最中间的指向 后面 打印分隔符
        {
          System.out.print("## ");
        }
      }
      System.out.println();
      if(array[middle] == value){
        return middle;
      }
      if(value < array[middle]){
        high = middle - 1;
      }
      if(value > array[middle]){
        low = middle + 1;
      }

    }
    return -1;
  }

  /**
   * @param args
   */
  public static void main(String[] args){
    int[] array = {7,3,9,5,6,8,1};
    int[] array1 = BubbleSort.bubbleSort(array);

    int index = binarySearch(array1,1);
    System.out.println("所在的位置:"+index);

  }

}

打印结果:

第1趟排序

3 7 5 6 8 1 9

第2趟排序

3 5 6 7 1 8 9

第3趟排序

3 5 6 1 7 8 9

第4趟排序

3 5 1 6 7 8 9

第5趟排序

3 1 5 6 7 8 9

第6趟排序

1 3 5 6 7 8 9

第7趟排序

1 3 5 6 7 8 9

1 3 5 6 ## 7 8 9

1 3 ## 5 6 7 8 9

1 ## 3 5 6 7 8 9

所在的位置:0

分析总结

查找算法中,二分法是速度最快的,但是必须是有序的序列。这些都是算法的基础中的基础,还需要我们下大功夫来试验,来总结,来吸收,坚持算法学习中.

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多