java:高速排序算法与冒泡排序算法
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;
}
}
}
先说下关于高速排序算法的思路:
选取数组第一个数字,作为key.并设置变量i为0,j为数组长度.
从数组最后一位開始向前找,找什么呢?找比key小的数字(不能等于),并记录下坐标j.限制条件是,在向前找的过程中假设一直没找到比key小的数值,就在i<j的时候停止(假设没有找到j就做减一操作继续找).假设找到了就将数组[j]与数组[i]的值对换并结束.
从数组第一位開始向后找,找什么呢?找比key大的数字(不能等于),并记录下坐标i.限制条件是,在向前找的过程中假设一直没找到比key大的数值,就在i<j的时候停止(假设没有找到i就做加一操作继续找).假设找到了就将数组[j]与数组[i]的值对换并结束.
完毕如上的操作,打印输出数组发现:数据变得相对有序了,就是在数组中key值坐标前面的都是小于key的,key值坐标后面的都是大于key值得,
所以大家明确了:将以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:高速排序算法与冒泡排序算法的更多相关文章
- Java中数组的几个常用算法:插入算法,删除算法,冒泡排序算法
前言: 在Java中我们常常会用数组,提到数组就不得不介绍数组中常用到的几个算法. 有插入算法,删除算法,冒泡排序算法等. 在学习这几个数组的算法前,我们先来了解一下关于数组一些基本知识. 数组的基本 ...
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
- 【排序算法】冒泡排序算法 Java实现
基本思想 设数组长度为N. 比较前后两个数据,如果前面的数据大于后面的数据,就将两个数据交换. 这样对数组的第0个数据到N - 1个数据进行遍历后,最大的一个数据就沉到了数组的第N - 1个位置. N ...
- 冒泡排序算法的C++,Java和Python实现和冒泡排序算法三种语言效率的比较
冒泡排序原理: 这一篇百度经验讲得很好,我不多说了 https://jingyan.baidu.com/article/6525d4b13f920bac7d2e9484.html 他讲的是C语言,没有 ...
- java排序算法之冒泡排序和快速排序
总结一下Java排序算法,以便记忆. 各类排序的时间复杂度: 排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性 直接插入排序 O(n2)O(n2) O( ...
- 我的Java开发学习之旅------>Java经典排序算法之冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已 ...
- C#实现(递归和非递归)高速排序和简单排序等一系列排序算法
本人由于近期工作用到了一些排序算法.就把几个简单的排序算法.想冒泡排序,选择排序,插入排序.奇偶排序和高速排序等整理了出来,代码用C#代码实现,而且通过了測试.希望能给大家提供參考. ...
- 冒泡排序算法 :BubbleSort
java中的经典算法:冒泡排序算法 $. 可以理解成当你静止一杯可乐时,里面的CO2随着你的静止,由于不不易溶于水的性质, 且会以气泡的形式逐渐向上漂浮.越大的气泡上浮速度越快. 冒泡排序算法的原理于 ...
- PHP实现冒泡排序、双向冒泡排序算法
冒泡排序(Bubble Sort),是一种较简单的.稳定的排序算法.冒泡排序算法步骤:比较相邻的元素,如果第一个比第二个大,就交换他们两个的位置:对每对相邻的元素执行同样的操作,这样一趟下来,最后的元 ...
随机推荐
- linux---Vim命令集
Vim命令集 命令历史 以:和/开头的命令都有历史纪录,能够首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗体中输入下面命令就可以 vim 直接启动vim vim filena ...
- 网站通常使用一些javascript包裹 简化电话
//对于Web地址参数 //前面加"=="进行标识,否则直接返回 //解码时依据是否含有"=="标识来决定是否要解码 var base64EncodeChars ...
- Atitit.软件GUIbutton和仪表板(01)--警报系统--
Atitit.软件GUIbutton和仪表板(01)--警报系统-- 1. 温度报警防区(鲁大师,360taskman) 1 2. os-区-----cpu_mem_io资源占用监測 1 3. Vm区 ...
- 苹果WatchKit轻松入门
背景 前段时间苹果Apple推出 WatchKit,用于开发Apple Watch应用,同时也推出了 Xcode6.2 Beta(非稳定版,好期待稳定版)版本用于开发 Watch App.Apple ...
- hive内置函数大全
====================================== 一.关系函数 1.等值比較:= 语法:A=B 操作类型:全部基本类型 2.不等值比較:<> 语 ...
- [cocos2dx注意事项014]一个用于cocos2dx对象智能指针模板
现在,C++有许多实现智能指针,一个更无所谓.哈. 这种智能指针是专为cocos2dx 2.2.x自定义.主要的易用性,同时必须遵循现有的cocos2dx内存管理.特殊实现这样的智能指针.无需在使用时 ...
- 二元最近的共同祖先问题(O(n) time 而且,只有一次遍历,O(1) Space (它不考虑函数调用栈空间))
问题: 找到两个节点的二叉树的最近的共同祖先. 首先可以参考这个博客http://blog.csdn.net/cxllyg/article/details/7635992 ,写的比較具体,包含了节点包 ...
- 【高德地图API】从头德国高中生JS API(三)覆盖物——大喊|折线|多边形|信息表|聚合marker|点蚀图|照片覆盖
覆盖物,是一张地图的灵魂.有覆盖物的地图.才是完整的地图.在一张地图上,除了底层的底图(瓦片图,矢量图),控件(有功能可操作的工具).最重要最必不可少的就是覆盖物了.覆盖物有多种.包含.标注.折线.多 ...
- 关于sql中去换行符的问题
今天要用bootstrap开发一个网页,要使用到JSON,但是JSON的格式不正确,然后在http://www.bejson.com/[Be JSON]中测试了一下JSON. 发现JSON中多了一个换 ...
- PE文件结构(四) 输出表
PE文件结构(四) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 输出表 一般来说输出表存在于dll中.输出表提供了 文件里函数的名字跟这些函数的地址, PE装载器通过输出表来改 ...