快排的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 ...
随机推荐
- java内存溢出实战
通过设置-XX:+HeapDumpOnOutOfMemoryError 自动生成dump文件,进行分析内存溢出原因 1.堆溢出堆溢出原因莫过于对象太多导致. 错误:java.lang.OutOfMem ...
- Java自学-I/O 中文问题
Java中的编码中文问题 步骤 1 : 编码概念 计算机存放数据只能存放数字,所有的字符都会被转换为不同的数字. 就像一个棋盘一样,不同的字,处于不同的位置,而不同的位置,有不同的数字编号. 有的棋盘 ...
- 简述Linux开机启动流程
计算机开机是一个神秘的过程.我们只是按了开机键,就看到屏幕上的进度条或者一行行的输出,直到我们到达登录界面.然而,计算机开机又是个异常脆弱的过程,我们满心期望的登录界面可能并不会出现,而是一个命令行或 ...
- EF自动创建数据库步骤之二(继承DbContext类)
创建好表实体类后,接着就是创建数据库上下文(继承DbContext)并将实体类添加进来. 代码示例如下: using DBClientEntity; using System; using Syste ...
- SQLMAP源码阅读(一)
- set实现交集,并集,差集
let a = new Set([1, 2, 3]); let b = new Set([4, 3, 2]); // 并集 let union = new Set([...a, ...b]); // ...
- .net web api 权限验证
做一个登录权限验证. 开始吧. using System; using System.Collections.Generic; using System.Drawing; using System.D ...
- ASM磁盘操作笔记
添加磁盘组 create diskgroup abc normal redundancy failgroup a disk 'ORCL:AAA' name AAA failgroup b disk ' ...
- windows系统DOC命令启动或停止服务
-- 启动服务 -- net start Mysql -- 停止服务 -- net stop Mysql-- 说明:MysqL没有大小写区分.可以直接小写mysql. -- 启动报错(net star ...
- Nginx 高级配置-https 功能
Nginx 高级配置-https 功能 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTTPS工作过程 1>.SSL/TLS SSL(Secure Socket Lay ...