Java:高速排序算法与冒泡算法

首先看下,冒泡排序算法与高速排序算法的效率:

例如以下的是main方法:

/**
  *
 * @Description:
 * @author:cuiyaonan2000@163.com
 * @date 2014年11月5日 下午1:02:10
  */
 public static void main(String[] args) {
  //高速排序算法測试
  int[] qArray = new int[100000];
  for (int i = 0; i < 100000; i++){
   qArray[i] = (int) (Math.random() * 100000);
  }
  long beforeQ = System.currentTimeMillis();
  quickSort(qArray, 0, qArray.length-1);
  System.out.println("高速排序执行时间:" + (System.currentTimeMillis() - beforeQ));
  
  //冒泡排序算法測试
  int[] bArray = new int[100000];
  for (int i = 0; i < 100000; i++){
   bArray[i] = (int) (Math.random() * 100000);
  }
  long beforeB = System.currentTimeMillis();
  bubble(bArray);
  System.out.println("冒泡排序执行时间:" + (System.currentTimeMillis() - beforeB));
 }

在一个有100000 个数字的数组中排序结果例如以下:

例如以下的是大家耳熟能详的冒泡算法(关于冒泡就不多说了):

/**
  *
 * @Description:
 * @author:cuiyaonan2000@163.com
 * @date 2014年11月5日 下午1:00:32
  */
 public static void bubble(int[] data) {
  for (int i = 0; i < data.length - 1; i++) {
   for (int j = i + 1; j < data.length; j++)
    if (data[i] > data[j]) {
     int temp = data[j];
     data[j] = data[i];
     data[i] = temp;
    }
  }
 }

先说下关于高速排序算法的思路:

  1. 选取数组第一个数字,作为key.并设置变量i为0,j为数组长度.

  2. 从数组最后一位開始向前找,找什么呢?找比key小的数字(不能等于),并记录下坐标j.限制条件是,在向前找的过程中假设一直没找到比key小的数值,就在i<j的时候停止(假设没有找到j就做减一操作继续找).假设找到了就将数组[j]与数组[i]的值对换并结束.

  3. 从数组第一位開始向后找,找什么呢?找比key大的数字(不能等于),并记录下坐标i.限制条件是,在向前找的过程中假设一直没找到比key大的数值,就在i<j的时候停止(假设没有找到i就做加一操作继续找).假设找到了就将数组[j]与数组[i]的值对换并结束.

  4. 完毕如上的操作,打印输出数组发现:数据变得相对有序了,就是在数组中key值坐标前面的都是小于key的,key值坐标后面的都是大于key值得,

  5. 所以大家明确了:将以key值为坐标的数组拆分成2个数组,分别去运行123步骤操作,终于就会产生一个有序数组

算法例如以下

/**
  *
 * @Description:
 * @author:cuiyaonan2000@163.com
 * @date 2014年11月5日 下午1:02:45
  */
 public static void quickSort(int[] array,int begin,int end){
  int theKey = array[begin];   //设置关键值
  int i = begin;
  int j = end;
  while(true){
   while(i<j && array[j] >= theKey)   //从后面找到一个比关键之小的数字坐标
    j-- ;
   if(i<j){  //交换
    int temp = array[j];
    array[j] = array[i];
    array[i] = temp;
   }else{
    break;
   }
   while(i<j && array[i] <= theKey)   //从前面找到一个比关键之大的数字坐标
    i++;
   if(i<j){ //交换
    int temp = array[j];
    array[j] = array[i];
    array[i] = temp;
   }else{
    break;
   }
  }
  
  if(--i > begin ){//这个表示一直找到 被拆分的数组中仅仅有一个值.否则递归调用
   quickSort(array,begin,i);
  }
  if(++j< end){ //这个表示一直找到 被拆分的数组中仅仅有一个值.否则递归调用
   quickSort(array,j,end);
  }
 }



java:高速排序算法与冒泡排序算法的更多相关文章

  1. Java中数组的几个常用算法:插入算法,删除算法,冒泡排序算法

    前言: 在Java中我们常常会用数组,提到数组就不得不介绍数组中常用到的几个算法. 有插入算法,删除算法,冒泡排序算法等. 在学习这几个数组的算法前,我们先来了解一下关于数组一些基本知识. 数组的基本 ...

  2. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...

  3. 【排序算法】冒泡排序算法 Java实现

    基本思想 设数组长度为N. 比较前后两个数据,如果前面的数据大于后面的数据,就将两个数据交换. 这样对数组的第0个数据到N - 1个数据进行遍历后,最大的一个数据就沉到了数组的第N - 1个位置. N ...

  4. 冒泡排序算法的C++,Java和Python实现和冒泡排序算法三种语言效率的比较

    冒泡排序原理: 这一篇百度经验讲得很好,我不多说了 https://jingyan.baidu.com/article/6525d4b13f920bac7d2e9484.html 他讲的是C语言,没有 ...

  5. java排序算法之冒泡排序和快速排序

    总结一下Java排序算法,以便记忆. 各类排序的时间复杂度: 排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性 直接插入排序 O(n2)O(n2) O( ...

  6. 我的Java开发学习之旅------>Java经典排序算法之冒泡排序

    冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已 ...

  7. C#实现(递归和非递归)高速排序和简单排序等一系列排序算法

        本人由于近期工作用到了一些排序算法.就把几个简单的排序算法.想冒泡排序,选择排序,插入排序.奇偶排序和高速排序等整理了出来,代码用C#代码实现,而且通过了測试.希望能给大家提供參考.     ...

  8. 冒泡排序算法 :BubbleSort

    java中的经典算法:冒泡排序算法 $. 可以理解成当你静止一杯可乐时,里面的CO2随着你的静止,由于不不易溶于水的性质, 且会以气泡的形式逐渐向上漂浮.越大的气泡上浮速度越快. 冒泡排序算法的原理于 ...

  9. PHP实现冒泡排序、双向冒泡排序算法

    冒泡排序(Bubble Sort),是一种较简单的.稳定的排序算法.冒泡排序算法步骤:比较相邻的元素,如果第一个比第二个大,就交换他们两个的位置:对每对相邻的元素执行同样的操作,这样一趟下来,最后的元 ...

随机推荐

  1. web.xmlf多ilter在执行顺序

    1.随着url-pattern路配置filter请务必先实施servlet-name路配置filter    2.随着url-partern路配置filter于.,按web.xml于filter-ma ...

  2. Spring MVC 基础

    Spring MVC 基础 1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是 ...

  3. c++学籍管理系统

    程序在编译时出错(vc++ 6.0) 求哪位大神帮忙改改 #include<iostream> #include <string> #include<conio.h> ...

  4. openstack临时存储后端

    声明: 本博客欢迎转发.但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习.研究和总结,如有雷同,实属荣幸! 眼下openstack提供了 ...

  5. 如何从Terminal Command Line编译并运行Scope

    Ubuntu SDK我们大部分的开发者是非常有效的.它甚至可以帮助我们进行在线调试.在这篇文章中,我们介绍了如何使用command line编译和执行我们scope. 1)创建一个主Scope 我们能 ...

  6. CFormView动态调整对话框的尺寸和调整比例控制的部署

    基于单个文件CFormView动态调整对话框的尺寸和调整比例控制的部署 假设你正在开发一个程序基于单个文件,使用CFormView基类来实现多种形式展示,那么,这个文件可能会给你一点帮助. 一.实现对 ...

  7. 新RSS reader

    阅读之前采取正确的方法,但是非常不介意,没有收到订阅很大. 走到今天 http://www.feedspot.com 2014/11/8追加:用下来感觉不错. feedspot 的相关快捷键例如以下: ...

  8. 读改善c#代码157个建议:建议13~15

    目录: 建议13:为类型输出格式化字符串 建议14:正确实现浅拷贝和深拷贝 建议15:使用dynamic来简化反射实现 一.建议13:为类型输出格式化字符串 有些类型需要我们根据业务需求提供字符串的格 ...

  9. teamfoundationserver2010之使用vs2010&&vs2013创建修改签入签出提交代码等操作

    好久之前就在个人的电脑上装了vs2013,看到原生支持html5和css3,前端开发还是挺不错的 而公司开发一直用着vs2010,真是羡慕嫉妒恨啊... 于是乎就有了今天的测试 使用工具 teamfo ...

  10. MVC 分离Controllers-Views

    将MVC中的Controllers.Model和View分别放到单独的项目中 Model: 新建-项目-Windows-类库 MVCTest.Model Controller:新建-项目-Window ...