使用JAVA直观感受快速排序与冒泡排序的性能差异
初学算法,肯定会编写排序算法
其中两个最为有名的就是冒泡排序和快速排序
理论上冒泡排序的时间复杂度为O(N^2),快速排序的时间复杂度为O(NlogN)
下面本门使用JAVA,分别编写三段排序程序
对十万个0-9999的整数进行一次冒泡排序
对十万个0-9999的整数进行1000次快速排序,使用递归完成
对十万个0-9999的整数进行1000次快速排序,使用堆栈完成
对十万个0-9999的整数进行一次冒泡排序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package sort; import java.util.Date; public class PopSort { public static void main(String[] args){ int N= 100000 ; int [] array= new int [N]; for ( int i= 0 ;i<N;i++) array[i]=( int ) (Math.random()* 9999 ); Date begin= new Date(); for ( int i=N- 1 ;i> 1 ;i--){ for ( int j= 0 ;j<i;j++){ if (array[j]>array[j+ 1 ]){ int tmp=array[j]; array[j]=array[j+ 1 ]; array[j+ 1 ]=tmp; } } } Date end= new Date(); System.out.println( "使用冒泡排序,对 " +N+ "个整数进行排序,用时:" +String.valueOf(end.getTime()-begin.getTime())+ "毫秒" ); for ( int i= 0 ;i< 100 ;i++) System.out.print(array[i]+ " " ); } } |
执行结果:
下面是使用递归方法的快速排序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
package sort; import java.util.Date; public class QuickSort { public static void main(String[] args){ int K= 1000 ; int N= 100000 ; Date begin = new Date(); for ( int num= 0 ;num<K;num++){ int [] array= new int [N]; for ( int i= 0 ;i<N;i++) array[i]=( int ) (Math.random()* 9999 ); sort(array, 0 ,array.length- 1 ); } Date end= new Date(); long time=end.getTime()-begin.getTime(); System.out.println( "使用递归方式进行快速排序,对 " +N+ "个整数进行排序 " +K+ "次,用时:" +String.valueOf(time)+ "毫秒\n平均用时:" +time/K+ "毫秒" ); } private static void sort( int [] array, int begin, int end){ int right=end,left=begin; while (right!=left){ for (;right>left;right--){ if (array[begin]>=array[right]) break ; } for (;left<right;left++){ if (array[begin]<array[left]) break ; } if (left!=right){ int tmp=array[left]; array[left]=array[right]; array[right]=tmp; } else if (right!=begin){ int tmp=array[begin]; array[begin]=array[left]; array[left]=tmp; } } if (left- 1 >begin) sort(array,begin,left- 1 ); if (right+ 1 <end) sort(array,right+ 1 ,end); } } |
执行结果:
最后一段程序是使用数据结构栈来实现的非递归快速排序算法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
package sort; import java.util.Date; import java.util.Stack; /** * 使用栈而不是递归来实现快排 * @author newflydd@189.cn * Time : 2016年1月8日 下午9:51:49 */ public class QuickSort2 { public static void main(String[] args) { Date begin = new Date(); Date end= null ; int K= 1000 ; int N= 100000 ; for ( int num= 0 ;num<K;num++){ int [] array= new int [N]; for ( int i= 0 ;i<N;i++) array[i]=( int ) (Math.random()* 9999 ); Stack<Node> stack= new Stack<Node>(); stack.add( new Node( 0 ,N- 1 )); while (!stack.isEmpty()){ Node node=stack.pop(); int right=node.end , left=node.begin; while (right!=left){ for (;right>left;right--) if (array[node.begin]>=array[right]) break ; for (;left<right;left++) if (array[node.begin]<array[left]) break ; if (left!=right){ int tmp=array[left]; array[left]=array[right]; array[right]=tmp; } else if (right!=node.begin){ int tmp=array[node.begin]; array[node.begin]=array[right]; array[right]=tmp; } } if (left- 1 >node.begin) stack.push( new Node(node.begin,left- 1 )); if (node.end>right+ 1 ) stack.push( new Node(right+ 1 ,node.end)); } } end= new Date(); long time=end.getTime()-begin.getTime(); System.out.println( "使用数据结构栈进行快速排序,对 " +N+ "个整数进行排序 " +K+ "次,用时:" +String.valueOf(time)+ "毫秒\n平均用时:" +time/K+ "毫秒" ); } } class Node{ public int begin; public int end; public Node( int begin, int end){ this .begin=begin; this .end=end; } } |
执行结果:
综上所述,可以直观的看出来
复杂度为O(N^2)的冒泡排序速度相当慢,一次排序就要18秒,而复杂度为O(NlogN)的快速排序基本上20毫秒内就搞定,这就是算法的力量啊。
递归函数在这里并不会影响性能,直观,简洁的递归算法是相当实用的,除非动态规划算法一定要将递归转变成循环,否则大多数情况下并不需要改变递归方法,而非递归算法因为会引入其他数据结构,有可能导致程序还会稍稍有些额外开支。
本文来自:http://www.hexcode.cn/article/4090/show
使用JAVA直观感受快速排序与冒泡排序的性能差异的更多相关文章
- Java基础(49):快速排序的Java封装(含原理,完整可运行,结合VisualGo网站更好理解)
快速排序 对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序.使用的是递归原理,在所有同数量级O(n longn) 的排序方法中,其平均性能最好.就平均时间而言,是目前被认为最 ...
- Python之排序算法:快速排序与冒泡排序
Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...
- 常用算法Java实现之快速排序
快速排序和冒泡排序相似,都是通过多次比较和交换来实现排序. 具体流程如下: 1.首先设定一个分界值,通过分界值将数组分成左右两部分,将大于等于分界值的数据交换集中到右侧数组,将小于分界值的数据交换集中 ...
- 这段时间对c#和java的感受
这段时间对c#和java的感受 虽然很多书上说语法相似,但实际这是一个接近于门外汉的看法 真正的不同是 c#对更贴近系统API, 而java倡导跨平台 因而c#语法关键字更多,更细, 而ja ...
- 快速排序 Java实现的快速排序
快速排序 Java实现的快速排序: package xc; import java.util.Arrays; import java.util.Random; /** * * @author dax ...
- java Scanner与BufferedReader读取键盘输入性能比较
java Scanner与BufferedReader读取键盘输入性能比较 1.Scanner和BufferedReader 性能比较 在java中常见的从键盘获取输入的方式有 ...
- David MacKay:用信息论解释 '快速排序'、'堆排序' 本质与差异
这篇文章是David MacKay利用信息论,来对快排.堆排的本质差异导致的性能差异进行的比较. 信息论是非常强大的,它并不只是一个用来分析理论最优决策的工具. 从信息论的角度来分析算法效率是一件很有 ...
- 90 % Java 程序员被误导的一个性能优化策略
我们经常看到一些 Java 性能优化的书或者理念,说不要在循环内定义变量,这样会占用过多的内存影响性能,而要在循环外面定义.接触 Java 这么久以来,相信很多 Java 程序员都被这种代码性能优化策 ...
- 【转载】Java与C++语言在作用域上的差异浅析
http://developer.51cto.com/art/200906/126199.htm 差异一:变量作用域的不同 如下面这段程序代码是符合C++语言的语法要求的.其可以在C语言下正常运行.但 ...
随机推荐
- JavaScript之表单验证讲解
JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证. JavaScript 表单验证 JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些 ...
- 如何理解JS项目
JS API(DOM/PhoneGap/Cordova/NodeJS/Library/Android/MongoDB....)最基础,可以看懂一行代码. -------> JS OOP, JS语 ...
- ECMAScript 5.1中对属性的操作
此操作只针对新版本浏览器. Object.defineProperty(obj,'name',{configurable:true/false,enumberable:true/false,value ...
- 【Spark】概述
大数据数据处理模型: 1.Google的MapReduce是一个简单通用和自动容错的批处理计算模型.但,不适合交互式和流式计算! 2.Storm 3.Impala 4.GraphLab 5.Spark ...
- Webpack+React配合开发
前面两篇关于webpack的基础和进阶,请先务必阅读之前的文章. Webpack教程一 Webpack教程二 什么是React React是一个由Facebook开发的library,它的口号是“A ...
- poj 1511(SPFA+邻接表)
题目链接:http://poj.org/problem?id=1511 思路:题目意思很简单就是要求源点到各点的最短路之和,然后再求各点到源点的最短路之和,其实就是建两个图就ok了,其中一个建反图.1 ...
- Java集合框架(一)
Java中集合类的关系图: Collection 先来集合中的最大接口——Collection 可以通过查看JDK帮助文档,了解Collection接口中的最共性的方法.通过以下代码示例演示这些方法 ...
- [转载]U3d常规性能优化技巧
以下技巧并不是必须的,但是对于想要提升游戏性能的人来说应该还是很不错的. 优化的常规技巧 n 剖析你的游戏. 不要花费时间来优化那些晦涩的代码或者缩减图形文件的大小,除非这是你游戏的瓶颈.第一次剖析你 ...
- key-value数据库
http://blog.csdn.net/byane/article/details/6928519 传统的文件系统中,需要维护目录的层次结构,使用dentry,inode,directory等复杂结 ...
- gcc: error trying to exec 'cc1plus': execvp: 没有那个文件或目录
问题: 解决办法: 1.没安装G++ 可使用 sudo apt-get install g++ 进行安装 2.gcc版本和g++版本不相符 可利用gcc -v和g++ -v 查看版本