java 中冒泡、二分、快速算法详解

1、冒泡算法的原理:

冒泡排序算法的一般性策略:搜索整个值列,比较相邻元素,如果两者的相对次序不对,则交换它们,其结果是最大值“想水泡一样”移动到值列的最后一个位置上,这也是它在最终完成排序的值列中合适的位置。然后再次搜索值列,将第二大的值移动至倒数第二个位置上,重复该过程,直至将所有元素移动到正确的位置上。

下面是两个Java冒泡算法程序

2、冒泡代码如下:

public class BubbleSort {
  public static void bubbleSort(int[] a) {
    int temp;
    for (int i = 0; i < a.length - 1; ++i) {
      for (int j = a.length - 1; j > i; --j) {
        if (a[j] < a[j - 1]) {
          temp = a[j];
          a[j] = a[j - 1];
          a[j - 1] = temp;
        }
      }
    }

  }

  public static void main(String[] args) {

    int a[] = { 49,38,65,97,76,13,27,49};
    bubbleSort(a);
    System.out.println(Arrays.toString(a));
  }

}

2、二分算法

(1)前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序

(2)原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后;将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。可能描述得不是很清楚,若是不理解可以去网上找。从描述上就可以看出这个算法适合用递归来实现,可以用递归的都可以用循环来实现。所以我们的实现分为递归和循环两种,可以根据代码来理解算法

(3)实现:代码如下

 package org.cyxl.algorithm.search; 

  /**
  * 二分查找
  * @author cyxl
  *
  */
  public class BinarySearch {
    private int rCount=0;
    private int lCount=0; 

    /**
    * 获取递归的次数
    * @return
    */
    public int getrCount() {
      return rCount;
    } 

    /**
    * 获取循环的次数
    * @return
    */
    public int getlCount() {
      return lCount;
    }
  /**
    * 执行递归二分查找,返回第一次出现该值的位置
    * @param sortedData  已排序的数组
    * @param start     开始位置
    * @param end      结束位置
    * @param findValue   需要找的值
    * @return       值在数组中的位置,从0开始。找不到返回-1
    */
    public int searchRecursive(int[] sortedData,int start,int end,int findValue)
    {
      rCount++;
      if(start<=end)
      {
       //中间位置
        int middle=(start+end)>>1;  //相当于(start+end)/2
        //中值
        int middleValue=sortedData[middle]; 

        if(findValue==middleValue)
        {
          //等于中值直接返回
      return middle;
        }
        else if(findValue<middleValue)
        {
          //小于中值时在中值前面找
          return searchRecursive(sortedData,start,middle-1,findValue);
        }
        else
        {
         //大于中值在中值后面找
          return searchRecursive(sortedData,middle+1,end,findValue);
        }
      }
      else
      {
        //找不到
        return -1;
      }
    }
   /**
    * 循环二分查找,返回第一次出现该值的位置
    * @param sortedData  已排序的数组
    * @param findValue   需要找的值
    * @return       值在数组中的位置,从0开始。找不到返回-1
    */
    public int searchLoop(int[] sortedData,int findValue)
    {
      int start=0;
     int end=sortedData.length-1; 

      while(start<=end)
      {
        lCount++;
        //中间位置
        int middle=(start+end)>>1;  //相当于(start+end)/2
        //中值
       int middleValue=sortedData[middle]; 

       if(findValue==middleValue)
        {
          //等于中值直接返回
          return middle;
       }
      else if(findValue<middleValue)
        {
          //小于中值时在中值前面找
          end=middle-1;
       }
       else
        {
          //大于中值在中值后面找
          start=middle+1;
        }
      }
      //找不到
      return -1;
    }
  } 

4、测试代码

package org.cyxl.algorithm.search.test; 

  import org.cyxl.algorithm.search.BinarySearch;
  import org.junit.Test; 

  public class BinarySearchTest {
    @Test
    public void testSearch()
    {
      BinarySearch bs=new BinarySearch(); 

      int[] sortedData={1,2,3,4,5,6,6,7,8,8,9,10};
      int findValue=9;
      int length=sortedData.length; 

     int pos=bs.searchRecursive(sortedData, 0, length-1, findValue);
      System.out.println("Recursice:"+findValue+" found in pos "+pos+";count:"+bs.getrCount());
      int pos2=bs.searchLoop(sortedData, findValue); 

      System.out.println("Loop:"+findValue+" found in pos "+pos+";count:"+bs.getlCount());
    }
  } 

5、总结:这种查找方式的使用场合为已排序的数组。可以发现递归和循环的次数是一样的

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2017-06-21

java冒泡排序和快速排序代码

冒泡排序: 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. public class BubbleSorted{ public BubbleSorted(){ int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,5

Java实现冒泡排序算法

冒泡排序: 就是按索引逐次比较相邻的两个元素,如果大于/小于(取决于需要升序排还是降序排),则置换,否则不做改变 这样一轮下来,比较了n-1次,n等于元素的个数:n-2,n-3 ... 一直到最后一轮,比较了1次 所以比较次数为递减:从n-1 到 1 那么总的比较次数为:1+2+3+--+(n-1),  以等差公式计算:(1+n-1)/2*(n-1) ==> n/2*(n-1) ==> (n^2-n) * 0.5 用大O表示算法的时间复杂度:O(n^2) ,  忽略了系数0.5和常数-n. 算

Java各种排序算法汇总(冒泡,选择,归并,希尔及堆排序等)

本文实例汇总了Java各种排序算法.分享给大家供大家参考,具体如下: 1. 冒泡排序: public class SortTest { public static void main(String[] args) { int[] a = {345,7,32,5,4,-1,3,12,23,110,45645,321,456,78,-1,78,78,32,444,345}; show(a); bubbleSort(a); show(a); } private static void bubbleSo

Java经典算法汇总之冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复第一趟步骤,直至全部排序完成. 举例说明:要排序数组:int[]arr={6,3,8,2,9,1}; 第一趟排序: 第一次排序:6和3比较,6大于3,交换位置:368291 第二次排序:6和8比较,6小于8,不交换位置:36

Java实现的各种排序算法(插入排序、选择排序算法、冒泡排序算法)

一.插入排序算法实现java版本 public static int[] insert_sort(int[] a) { for (int i = 0; i < a.length; i++) { for(int j=i+1;j>0&&j<a.length;j--) { if(a[j]<a[j-1]) { int tmp = a[j]; //这样定义初始化逻辑上是可以的,j变量,每次tmp的值变化的 a[j] = a[j-1]; a[j-1] = tmp; } } }

Java实现冒泡排序算法及对其的简单优化示例

原理 冒泡排序大概是所有程序员都会用的算法,也是最熟悉的算法之一. 它的思路并不复杂: 设现在要给数组arr[]排序,它有n个元素. 1.如果n=1:显然不用排了.(实际上这个讨论似乎没什么必要) 2.如果n>1: (1)我们从第一个元素开始,把每两个相邻元素进行比较,如果前面的元素比后面的大,那么在最后的结果里面前者肯定排在后面.所以,我们把这两个元素交换.然后进行下两个相邻的元素的比较.如此直到最后一对元素比较完毕,则第一轮排序完成.可以肯定,最后一个元素一定是数组中最大的(因为每次都把相对

冒泡排序的原理及java代码实现

概述 冒泡排序是一种简单的排序算法.它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的开始. 简单点说,就是: 冒泡排序是將比較大的數字沉在数组的后面(可以理解为下面),较小的浮在前面(上面). 直观释义图: 步骤 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元

Java 冒泡排序、快速排序实例代码

冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地 进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 冒泡排序的算法实现如下:[排序后,数组从小到大排列] /** * 冒泡排序 * 比较相邻的元素.如果第一个比第二个大,就交换他们两个. * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应

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

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

java冒泡排序简单实例

话不多说,请看代码: //冒泡排序,从数组前面向后循环比较 public static void sort1(int[] aa){ int size=aa.length; int temp; //循环数组 for(int i=0;i<size;i++){ //aa[i]分别与i位后面的所有数比较并交换,aa[i]成为最小值 for(int j=i+1;j<size;j++){ if(aa[i]>aa[j]){ temp=aa[i]; aa[i]=aa[j]; aa[j]=temp; }

Java Servlet简单实例分享(文件上传下载demo)

项目结构 src com servletdemo DownloadServlet.java ShowServlet.java UploadServlet.java WebContent jsp servlet download.html fileupload.jsp input.jsp WEB-INF lib commons-fileupload-1.3.1.jar commons-io-2.4.jar 1.简单实例 ShowServlet.java package com.servletdem

Java冒泡排序简单实现

算法描述:对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较和交换后,n个记录中的最大记录将位于第n位:然后对前(n-1)个记录进行第二轮比较:重复该过程直到进行比较的记录只剩下一个为止. 冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后. 设数组的长度为N: (1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换. (2)这样对数组的第0个数据到N-1个数据进行一次遍

java反射简单实例

本文实例讲述了java反射简单实现方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package reflect; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties;

Java WebService 简单实例(附实例代码)

前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要的重复操作.  一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22  二.创建服务端 1.创建[Web Service Project],命名为[TheService]. 2.创建[Class]类,命名为[ServiceHello],位于[com.hyan.service]包下. 3.编写供客户端调用的方法,即编译方法代码. 4.进行编译 说明:编译失败的话,请将该项目引用的jd

Java冒泡排序的定义与实例代码

冒泡排序 在八大排序中,冒泡排序是最为出名的排序算法之一! 冒泡排序的代码还是相当简单的,两层循环,外层是冒泡轮数,里层是依次比较,这个算法的时间复杂度为O(n2): 冒泡排序的思想: 比较数组中相邻的两个元素,如果第一个数比第二个数大,就交换它们的位置 每一次比较都会产生一个最大或最小的元素 下一次循环就只排序剩下的元素 依次循环,直到所有元素排序完成 通过实例理解: public static void main(String[] args) { int[] a={55,45,33,24,7

Java算法之数组冒泡排序代码实例讲解

冒泡排序是数组查找算法中最为简单的算法 冒泡排序原理: 假设一个数组长度为k(最高索引k-1),遍历前k - 1个(最高索引k-2)元素,若数组中的元素a[i]都与相邻的下一个元素a[i+1]进行比较,若a[i] > a[i+1] ,则这两个元素交换位置.以此类推,若a[i+1] > a[i+2],则交换位置-直至a[k-2]与a[k-1]比较完毕后,第0轮迭代结束.此时,a[k-1]为数组元素中的最大值. 第1轮迭代,再对数组a的前k-1个元素重复进行以上操作. - 第k-2轮迭代,对数组a

Java实现一个小说采集程序的简单实例

被标题吸引进来的不要骂我. 只是一个简单的实现,随手写了来下载一部喜欢的小说的.示例中的小说只是示例,不是我的菜. 使用了jsoup.挺好用的一个工具. 有需要的话,参考下自己改吧.挺简单的,是吧. 代码如下: package com.zhyea.doggie; import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.n

java发送http请求并获取状态码的简单实例

目前做项目中有一个需求是这样的,需要通过java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page/qizha/pros_add.jsp"); try { HttpURLConnection uConnection = (HttpURLConnection) u.openConnection(); try { uConnection.connect(); Sy