初学算法,肯定会编写排序算法

其中两个最为有名的就是冒泡排序和快速排序

理论上冒泡排序的时间复杂度为O(N^2),快速排序的时间复杂度为O(NlogN)

下面本门使用JAVA,分别编写三段排序程序

  1. 对十万个0-9999的整数进行一次冒泡排序

  2. 对十万个0-9999的整数进行1000次快速排序,使用递归完成

  3. 对十万个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;
    }
}

执行结果:

综上所述,可以直观的看出来

  1. 复杂度为O(N^2)的冒泡排序速度相当慢,一次排序就要18秒,而复杂度为O(NlogN)的快速排序基本上20毫秒内就搞定,这就是算法的力量啊。

  2. 递归函数在这里并不会影响性能,直观,简洁的递归算法是相当实用的,除非动态规划算法一定要将递归转变成循环,否则大多数情况下并不需要改变递归方法,而非递归算法因为会引入其他数据结构,有可能导致程序还会稍稍有些额外开支。

本文来自:http://www.hexcode.cn/article/4090/show

使用JAVA直观感受快速排序与冒泡排序的性能差异的更多相关文章

  1. Java基础(49):快速排序的Java封装(含原理,完整可运行,结合VisualGo网站更好理解)

    快速排序 对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序.使用的是递归原理,在所有同数量级O(n longn) 的排序方法中,其平均性能最好.就平均时间而言,是目前被认为最 ...

  2. Python之排序算法:快速排序与冒泡排序

    Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...

  3. 常用算法Java实现之快速排序

    快速排序和冒泡排序相似,都是通过多次比较和交换来实现排序. 具体流程如下: 1.首先设定一个分界值,通过分界值将数组分成左右两部分,将大于等于分界值的数据交换集中到右侧数组,将小于分界值的数据交换集中 ...

  4. 这段时间对c#和java的感受

    这段时间对c#和java的感受 虽然很多书上说语法相似,但实际这是一个接近于门外汉的看法 真正的不同是 c#对更贴近系统API,      而java倡导跨平台 因而c#语法关键字更多,更细, 而ja ...

  5. 快速排序 Java实现的快速排序

    快速排序  Java实现的快速排序: package xc; import java.util.Arrays; import java.util.Random; /** * * @author dax ...

  6. java Scanner与BufferedReader读取键盘输入性能比较

    java  Scanner与BufferedReader读取键盘输入性能比较            1.Scanner和BufferedReader 性能比较 在java中常见的从键盘获取输入的方式有 ...

  7. David MacKay:用信息论解释 '快速排序'、'堆排序' 本质与差异

    这篇文章是David MacKay利用信息论,来对快排.堆排的本质差异导致的性能差异进行的比较. 信息论是非常强大的,它并不只是一个用来分析理论最优决策的工具. 从信息论的角度来分析算法效率是一件很有 ...

  8. 90 % Java 程序员被误导的一个性能优化策略

    我们经常看到一些 Java 性能优化的书或者理念,说不要在循环内定义变量,这样会占用过多的内存影响性能,而要在循环外面定义.接触 Java 这么久以来,相信很多 Java 程序员都被这种代码性能优化策 ...

  9. 【转载】Java与C++语言在作用域上的差异浅析

    http://developer.51cto.com/art/200906/126199.htm 差异一:变量作用域的不同 如下面这段程序代码是符合C++语言的语法要求的.其可以在C语言下正常运行.但 ...

随机推荐

  1. awk 统计数据在文件中的出现次数

    突然发现awk原来可以统计同一数据在要处理的文件中所出现的次数.原来的时候为了分析数据还自己写程序,哎,无语,当时还以为自己多强,手工分析不过来的东西写程序处理.现在想来实在是年少轻狂.解决问题嘛,不 ...

  2. console中一些不常用的实用方法

    console.group('分组1'); console.table( [ {key1: 1,key2: 2,key3: 3}, {key1: 1,key2: 2,key3: 3}, {key1: ...

  3. org.apache.kafka.common.network.Selector

    org.apache.kafka.common.client.Selector实现了Selectable接口,用于提供符合Kafka网络通讯特点的异步的.非阻塞的.面向多个连接的网络I/O. 这些网络 ...

  4. Unity 3D 游戏上线之后的流水总结

    原地址:http://tieba.baidu.com/p/2817057297?pn=1 首先.unity 灯光烘焙 :Unity 3D FBX模型导入.选项Model 不导入资源球.Rig 不导入骨 ...

  5. ubuntu 点点滴滴

    pptpd http://linux.cn/article-3376-1.html 命令行升级ubuntu版本 do-release-upgrade -d  寻找最新的稳定版本,加上-d参数则包括不稳 ...

  6. github and SourceTree初步使用

    1.建立连接(一次就行了) 输入你的github名字 2.创建仓库 3.下载仓库 这个时候打开SouceTree就可以看到之前创的仓库了 点击克隆,创建一个文件夹,讲路径设置好 这时候查看本地列表就会 ...

  7. Android loader 详解

    装载器从android3.0开始引进.它使得在activity或fragment中异步加载数据变得简单.装载器具有如下特性: 它们对每个Activity和Fragment都有效. 他们提供了异步加载数 ...

  8. sql server 存储过程,事务

    1.存储过程,事务 CREATE PROCEDURE Proc_ceshi @id int, ), @returnval int output AS BEGIN SET NOCOUNT ON; Set ...

  9. VS输入法问题

    问题描述:启动VS,打开Winform等的界面设计,无法为控件输入中文,另外,运行程序,无法在TextBox等控件中输入中文: 本人的系统环境:Win7旗舰版,VS2008.VS2010和VS2012 ...

  10. 李洪强漫谈iOS开发[C语言-004]-开发概述程序设计语言程序编译过程

    汇编语言 指令用特定的名字来标记,这就是汇编语言 人比较容易看懂汇编语言 汇编直接和程序一一对应的 有汇编器把程序翻译成机器码 把高级语言编译成计算机识别的语言 程序编译过程 命令行 UNIX 系统中 ...