快排的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图像重采样算法
1.算法功能简介 图像重采样是指对采样后形成的由离散数据组成的数字图像按所需的像元位置或像元问距重新采样,以构成几何变换后的新图像.重采样过程本质上是图像恢复过程,它用输入的离散数字图像重建代表原始图 ...
- 数据库xp_cmdshell使用
首先也开启组件. sp_configure reconfigure go sp_configure reconfigure go 删除本地文件,注意是删除数据库所在的服务器的本地文件. exec ma ...
- C#中 char、byte、string
var str = "我是中国人";var str1 = "abc"; char[] chars = str.ToCharArray();char[] char ...
- Vue定义组件和生命周期函数及实例演示!
定义全局组件 Vue.component("name",{...}) 定义局部组件 let Com = {....} new Vue({ data : ..., ..., comp ...
- XSS漏洞初窥(通过dvwa平台进测试)
xss的全称是:Cross Site Script,中文名叫“跨站脚本攻击”,因为和CSS重名,所以改名XSS.作为一个网站是肯定要和用户有交互的,那么肯定就伴随着信息的输入输出,而利用xss就是通过 ...
- 基于Spring Boot的注解驱动式公众号极速开发框架FastBootWeixin
本框架基于Spring Boot实现,使用注解完成快速开发,可以快速的完成一个微信公众号,重新定义公众号开发. 在使用本框架前建议对微信公众号开发文档有所了解,不过在不了解公众号文档的情况下使用本框架 ...
- CDH报错:ScmActive at bootup: Failed to validate the identity of Cloudera Manager.
报错原因以及解决办法在官网: https://www.cloudera.com/documentation/enterprise/5-8-x/topics/cm_failover_db.html 1. ...
- Django框架(十四)-- forms组件、局部钩子、全局钩子
一.什么是forms组件 forms组件就是一个类,可以检测前端传来的数据,是否合法. 例如,前端传来的邮箱数据,判断邮件格式对不对,用户名中不能以什么开头,等等 二.forms组件的使用 1.使用语 ...
- JAVA concurrent包下Semaphore、CountDownLatch等用法
CountDownLatch 跟join的区别 CountDownLatch用处跟join很像,但是CountDownLatch更加灵活,如果子线程有多个阶段a.b.c; 那么我们可以实现在a阶段完成 ...
- nginx实现tcp的反向代理
nginx不仅可以实现http的反向代理,同时也支持TCP的反向代理以SSH为例1.编译的时候需要加入--with-stream这个参数,以加载ngx_stream_core_module这个模块2 ...