[算法]用JAVA实现快速排序
问题描述:
实现对数组的普通快速排序与随机快速排序
实验要求:
(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实现快速排序的更多相关文章
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 7种基本排序算法的Java实现
7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...
- 查找算法(Java实现)
1.二分查找算法 package other; public class BinarySearch { /* * 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据 */ p ...
- 几种简单的排序算法(JAVA)
几种排序算法(JAVA) 一.代码 package com.hdwang; import java.util.Arrays; /** * Created by admin on 2017/1/20. ...
- 常见排序算法总结 -- java实现
常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...
- 几大排序算法的Java实现(原创)
几大排序算法的Java实现 更新中... 注: 该类中附有随机生成[min, max)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流. 各个算法的思路都写在该类的注释中了,同 ...
- 深度实战玩转算法, Java语言7个经典应用诠释算法精髓
深度实战玩转算法,以Java语言主讲,通过7款经典好玩游戏,真正将算法用于实际开发,由算法大牛ACM亚洲区奖牌获得者liuyubobobo主讲,看得见的算法,带领你进入一个不一样的算法世界,本套课程共 ...
- 十大经典排序算法(java实现、配图解,附源码)
前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...
随机推荐
- Oracle GoldenGate OGG管理员手册(较早资料)
第一章 系统实现简述 前言 编写本手册的目的是为系统管理员以及相关操作人员提供 Oracle Goldengat 软 件的日常维护和使用的技术参考: 3 ORACLE 第二章 OGG 日常维护操作 ...
- include方便查找
#include <assert.h> //设定插入点#include <ctype.h> //字符处理#include <errno.h> //定义错误码#inc ...
- Linux下安装Tomcat7
一.Tomcat7软件包下载 Tomcat下载地址http://tomcat.apache.org/download-70.cgi 下载完成后, 将软件包apache-tomcat-7.0.82.ta ...
- Linux blkid命令详解
blkid命令对查询设备上所采用文件系统类型进行查询.blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型.LABEL.UUID等信息进行查询.要使用这个命令必须安装e2fsprogs ...
- Spring+微信小程序 卡券打通
近期公司项目需要使用到微信卡券模块,主要做的是在小程序打通微信卡券,实现小程序领取卡券的功能效果. 简单说下涉及的东西: Springboot—使用springboot做后端接口,非常便捷 并且根本是 ...
- 用windows自带的fsutil修改稀疏文件大小成功,但文件内容似乎丢失
fsutil sparse setflag. fsutil sparse setrange 10M对应字节,1G对应字节.. 看文件属性,实际尺寸是小了,但内容似乎也丢了..因为自己把该文件做成虚拟盘 ...
- 利用Intellij IDEA开发Spark程序
网上例子大多是基于scala的,并且配置基于sbt.scala的eclipse环境超级麻烦,所以下载IDEA. 准备:jdk,IDEA安装(可以不用事先安装sbt和Scala,这在IDEA里都可以pl ...
- 红黑树及其实例JDK中的TreeMap
红黑树是一种自平衡二叉查找树(binary search tree,BST),红黑树是一种比较复杂的数据结构,红黑树查找.插入.删除元素的时间复杂度为O(log n),n是树中元素的数目.文章的要讲的 ...
- zepto源码研究 - fx.js
简要:zepto 提供了一个基础方法animate来方便我们运用css动画.主要针对transform,animate以及普通属性(例如left,right,height,width等等)的trans ...
- const修饰的成员是类成员,还是实例成员?
很抱歉,我以为只有static修饰的成员是类成员,可以通过类名直接访问,然而,const 修饰的成员也属于类成员,直接通过类名访问,不能通过实例变量访问. 做维护久了,深刻的理解,扎实的基础对写出高质 ...