快排的java实现方式,用java代码来实现快排
1. 快排的思想
通过一趟排序将要排序的数据分割成独立的两部分,前一部分的所有数据都要小于后一部分的所有数据,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据的有序性。
2. 快排实现的核心步骤
①找基准点:一般是数组的第一个元素来充当;
②right:从数组的最后一个元素开始,从右往左,直到找到小于基准点的元素;每次都要right比left先走;
③left:从数组的第一个元素开始,从左往右,直到找到大于基准点的元素;
④交换 left 和 right 所在位置的两个元素;
⑥right 继续往左走,找到小于基准点的元素;left 继续往右走,找到大于基准点的元素;然后 left 和 right 再做交换;循环往复,直到两人相遇;
⑦将相遇点所在位置的元素和基准点所在位置的元素做交换,基准点到了中间位置(此时基准点左边的元素全都小于基准点右边的元素);
⑧【递归】将基准点左边的所有元素当成一个数组,重复①~⑦步骤;基准点右边的所有元素也是如此;
3. 快排的java代码实现
public class A01QuickSort {
public static void main(String[] args) {
A01QuickSort quickSort = new A01QuickSort(); // 测试快排的效率:
// int number = 1000000;
// int[] array = new int[number];
// for (int i = 0; i < array.length; i++) {
// array[i] = new Random().nextInt(number);
// } //配合后面的元素输出,测试快排是否排序准确:
int[] array = new int[] {181,181,187,181};
System.out.println("数组准备完毕~"); long start = System.currentTimeMillis();
quickSort.quickSort(array, 0, array.length - 1);
long end = System.currentTimeMillis();
System.out.println("quickSort 用时:" + (end - start));// 测试结果: 元素为5万个时:11毫秒。50万:66毫秒。100万:136毫秒 //遍历输出数组元素:
quickSort.traverseArray(array);
} /**
* 快排的实现
* @param target
* @param left
* @param right
*/
public void quickSort(int[] target, int left, int right) {
if (left >= right) {
return;
}
int pivot = target[left];// 基准点
int temp;
int i = left;
int j = right;//为什么要声明i和j,因为后面做迭代的时候还需要用到最初的left和right
while (i < j) {//验证array数组至少有2个元素,才要做排序
/**
* 提问:
* 为什么是 while里的判断,为什么是 “target[j] >= pivot”,而不是“target[j] > pivot”???
* 答: 数组[181,181,187,181],分别用上面两种while去测试:
* 如果是">="时,因为 181 >= 181 成立,所以right就会从右往左移;
* 如果是">"时,因为 181 > 181 成立,所以right就不会左移。
* 重点!!!right或left,必须有一方得是移动的!!!否则程序就会进入死循环!!!
*/
// 如果right一直都大于或等于pivot,则继续走,直到找到比pivot小的:
while (target[j] >= pivot && i < j) {
j--;
}
// 如果left一直都小于等于pivot,则继续走,直到找到比pivot大的:
while (target[i] <= pivot && i < j) {
i++;
}
// 此时right < pivot, left > pivot,将i和j做交换:
if (i < j) {//这里做判断是为了right到了left位置时,不用再将执行下面这三行代码了:
temp = target[i];
target[i] = target[j];
target[j] = temp;
}
}
// left和right相遇了:
// ①将相遇点的元素和pivot做交换:
target[left] = target[j];
target[j] = pivot;
// ②基准点两边的元素的分别再做排序:
quickSort(target, left, j - 1);
quickSort(target, j + 1, right);
} //遍历数组
public void traverseArray(int[] array) {
for(int element : array) {
System.out.println(element);
}
}
}
4. 快排的时间复杂度:O(n * log(n))
快排的时间复杂度分析:快排的时间复杂度分析(含图解)
快排的java实现方式,用java代码来实现快排的更多相关文章
- 【转】几种Java序列化方式的实现
0.前言 本文主要对几种常见Java序列化方式进行实现.包括Java原生以流的方法进行的序列化.Json序列化.FastJson序列化.Protobuff序列化. 1.Java原生序列化 Java原生 ...
- 《Java知识应用》Java加密方式(Base64)详解
1. 说明 Base64加密方式:比较简单,加密快,对普通大众可以起到加密的作用.在程序员眼中和透明一样. Base64应用场景:图片转码(应用于邮件,img标签,http加密) 2. 案例 impo ...
- 【第一期百题计划进行中,快来打卡学习】吃透java、细化到知识点的练习题及笔试题,助你轻松搞定java
[快来免费打卡学习]参与方式 本期百题计划开始时间:2022-02-09,今日打卡题已在文中标红. 0.本文文末评论区打卡,需要登录才可以打卡以及查看其他人的打卡记录 1.以下练习题,请用对应的知识点 ...
- 两种方式实现java生成Excel
Web应用中难免会遇到需要将数据导出并生成excel文件的需求.同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此.本博文 ...
- Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
最近老是遇见服务器内存溢出的问题,故在网上搜了搜,总结了一些java内存溢出的解决方式 java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都 ...
- java 22 - 9 多线程之 代码实现的方式2
多线程的代码实现: 方式2:实现Runnable接口 步骤: A:自定义类MyRunnable实现Runnable接口 B:重写run()方法 C:创建MyRunnable类的对象 D:创建Threa ...
- paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较
paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较 ##java ----------- 在JDK1.7中,摒弃了Java集合接口的实现类,如:Ar ...
- Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)
1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对 ...
- Centos中yum方式安装java
查看CentOS自带JDK是否已安装.◆输入:yum list installed |grep java. 若有自带安装的JDK,如何卸载CentOS系统自带Java环境?◆卸载JDK相关文件输入:y ...
- 3种方式实现Java多线程
java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...
随机推荐
- PIE SDK Alpha通道数据渲染
1. 功能简介 在计算机图形学中,一个RGB颜色模型的真彩图形,用由红.绿.蓝三个色彩信息通道合成的,每个通道用了8位色彩深度,共计24位,包含了所有彩色信息.为实现图形的透明效果,采取在图形文件的 ...
- PIE SDK栅格矢量化算法
1.算法功能简介 栅格数据矢量化较为复杂,如果由一幅扫描的数字化地图来建立矢量数据库,则需要经过数字图象处理,如边缘增强.细化.二值化.特征提取及模式识别才能获得矢量数据.人们通常将多色地图分色后逐个 ...
- vue中如果在页面中v-model的是字典,那么在定义字典的时候,需要明确定义键值为''或者[],否则给字典的键值赋值后页面不显示
如题 在template模板中 {{}} {{form_temp.blOwnerMemberList}} #是字典的形式哦 {{}} 在return的属性中 form_temp: { blOwnerM ...
- Winform中实现ZedGraph不显示y=0这条刻度线
场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
- dapperDemo
dapperDemo 下载链接:http://pan.baidu.com/s/1geQHXPT
- SQL查询数据库中所有表、表字段名及数据类型
select b.name,a.colid,a.name ,())+')' from systypes where a.xusertype=systypes.xusertype ) type from ...
- OKGo vs RxHttpUtils ...
jeasonlzy/okhttp-OkGohttps://github.com/jeasonlzy/okhttp-OkGo Android OkGo基本操作https://www.jianshu.co ...
- 【转】Git使用教程之基础篇
Git使用教程 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是 ...
- Fork/Join框架与Java8 Stream API 之并行流的速度比较
Fork/Join 框架有特定的ExecutorService和线程池构成.ExecutorService可以运行任务,并且这个任务会被分解成较小的任务,它们从线程池中被fork(被不同的线程执行)出 ...
- Mybatis-plus中不列出全部字段
//不列出全部字段 @Test public void test10() { QueryWrapper<User> wrapper = new QueryWrapper<>() ...