问题描述:
实现对数组的普通快速排序与随机快速排序
实验要求:
(1)实现上述两个算法
(2)统计算法的运行时间
(3)分析性能差异,作出总结

代码:

一:普通快速排序

public class QuickSort1 {
public static void QuickSort(int []A,int l,int r){
int temp;
int i = l;
int j = r;
if(l<r){
temp = A[i];
while(i != j){
while(i<j && A[j] >= temp){
--j;
}
A[i] = A[j];
while(i<j && A[i] <= temp){
++i;
}
A[j] = A[i];
}
A[i] = temp;
QuickSort(A, l, i-);
QuickSort(A, i+, r);
}
}

二:随机快速排序

    public static void exchange(int[] array,int a,int b){
int temp = 0;
temp = array[a];
array[a] = array[b];
array[b] = temp;
}
public static int random_patition(int[] A,int left,int right){
int temp = 0;
int i = left-1;
Random random = new Random();
int k = left + random.nextInt(right - left);
exchange(A,k,right);
temp = A[right];
//找到所有比temp小的数,放在temp左边
for(int j = left ; j<right ; j++){
if(A[j] <= temp){
i++;
exchange(A,i,j);
}
}
//将枢轴放回原位
exchange(A,i+1, right);
return i+1;
}
public static void QuickSort(int[] A,int l,int r){
if(l<r){
int dot = random_patition(A, l, r);
QuickSort(A, l, dot-1);
QuickSort(A, dot+1, r);
}
}

三:比较两个时间差的main函数

    public static void main(String[] args){
int[] A = new int[20000];
int[] A_copy = new int[20000];
//生成两个随机数组
// System.out.println("排序之前的20000个数是:");
// Random random = new Random();
// for(int i = 0; i<A.length;i++){
// A[i] = (int)random.nextInt(100000);
// A_copy[i] = A[i];
// System.out.print(A[i]+" ");
// if(i%10 == 0&&i!=0){
// System.out.print("\n");
// }
// } //生成两个1-20000的有序数组,目的:比较当数组有序时哪个排序速度快
for(int i = 0;i<A.length;i++){
A[i] = i;
A_copy[i] = i;
}
//普通快速排序算法
Date before1 = new Date();
long before1_QuickSort = before1.getTime();
QuickSort(A,0,1999);
Date after1 = new Date();
long after1_QuickSort = after1.getTime();
long time1 = after1_QuickSort - before1_QuickSort; //随机快速排序算法
Date before2 = new Date();
long before2_QuickSort = before2.getTime();
QuickSort2.QuickSort(A_copy, 0, 1999);
Date after2 = new Date();
long after2_QuickSort = after2.getTime();
long time2 = after2_QuickSort - before2_QuickSort;
System.out.println("\n普通快速排序之后的20000个数是:");
for(int k = 0;k<A.length;k++){
System.out.print(A[k]+" ");
if(k%10 == 0&&k!=0){
System.out.print("\n");
}
}
System.out.println("\n普通快速排序算法运行时间:"+time1);
System.out.println("随机快速排序算法运行时间:"+time2);
System.out.println("相差"+(time1-time2));
}

[算法]用JAVA实现快速排序的更多相关文章

  1. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  2. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  3. 7种基本排序算法的Java实现

    7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...

  4. 查找算法(Java实现)

    1.二分查找算法 package other; public class BinarySearch { /* * 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据 */ p ...

  5. 几种简单的排序算法(JAVA)

    几种排序算法(JAVA) 一.代码 package com.hdwang; import java.util.Arrays; /** * Created by admin on 2017/1/20. ...

  6. 常见排序算法总结 -- java实现

    常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...

  7. 几大排序算法的Java实现(原创)

    几大排序算法的Java实现 更新中... 注: 该类中附有随机生成[min, max)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流. 各个算法的思路都写在该类的注释中了,同 ...

  8. 深度实战玩转算法, Java语言7个经典应用诠释算法精髓

    深度实战玩转算法,以Java语言主讲,通过7款经典好玩游戏,真正将算法用于实际开发,由算法大牛ACM亚洲区奖牌获得者liuyubobobo主讲,看得见的算法,带领你进入一个不一样的算法世界,本套课程共 ...

  9. 十大经典排序算法(java实现、配图解,附源码)

    前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...

随机推荐

  1. 前端 网络三剑客之html 02

    html 四.表单标签 form标签: input系列:内敛标签 1.明文: 姓名:<input type="text" name="user" plac ...

  2. PHP解决网站大数据大流量与高并发

    1:硬件方面 普通的一个p4的服务器每天最多能支持10万左右的IP,如果访问量超过10W那么需要专用的服务器才能解决,如果硬件不给力软件怎么优化都是于事无补的.主要影响服务器的速度 有:网络-硬盘读写 ...

  3. magento2 重置后台密码

    项目根目录:运行如下命令 bin/magento admin:user:create --admin-user="admin" --admin-password="123 ...

  4. Programming Assignment 4: Boggle

    编程作业四 作业链接:Boggle & Checklist 我的代码:BoggleSolver.java 问题简介 Boggle 是一个文字游戏,有 16 个每面都有字母的骰子,开始随机将它们 ...

  5. Angular总结二:Angular 启动过程

    要弄清楚 Angular 的启动过程,就要弄明白 Angular 启动时加载了哪个页面,加载了哪些脚本,这些脚本做了哪些事? 通过 Angular 的编译依赖文件 .angular-cli.json ...

  6. Java Math类学习

    1.  java.lang.Math Math类其成员皆为静态成员(static),无需创建对象,直接用类名Math作为前缀使用它们即可. 2.  Math类有两个静态常量:E(自然对数)和PI(圆周 ...

  7. 编译Console程序时,可以指定Main入口函数

    有如下简单的console程序 using System; namespace HelloWorld { class Program { static void Main(string[] args) ...

  8. Oracle从一个用户导出数据到另一个用户

    如果想导入的用户已经存在: 1. 导出用户 expdp user1/pass1 directory=dumpdir dumpfile=user1.dmp 2. 导入用户 impdp user2/pas ...

  9. PHP类的静态(static)方法和静态(static)变量使用介绍

    PHP类的静态(static)方法和静态(static)变量使用介绍,学习php的朋友可以看下     在php中,访问类的方法/变量有两种方法: 1. 创建对象$object = new Class ...

  10. Day5 类和对象

    面向对象编程OOP 类:相似对象的集合. 对象 对象:实体.一切可以被描述的事物. 属性:特征. 方法:动作,行为. 类和对象的区别 [1]类时抽象的,对象是具体的. [2]类是一个模板,创建出来的对 ...