搞定Java快速排序
简介
快速排序(Quicksort),简称快排,是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1960年提出。它的基本思想分治法:即通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以使用递归实现。
二
算法思想
快速排序算法的核心思想是分治法,先比大小,然后分区。下面我们通过生活中的一个例子来解释一下这个算法思想。假设一个房间中有六个人,排成了一队,他们的年纪分别是21,36,26,22,18,29。我们希望按照他们的年纪从小到达重新进行排列,快速排序的思想是,选一个人的年纪作为基准数,这里选21,然后让剩下的人分别和21比较,小于21的都站在他的左边,大于21的都站在他的右边,通过21把这些人分成了两部分,然后对这两部分重复上边的步骤,即选基准数比较,分成两部分,再重复。。。。。。
三
实现思路
挖坑填数:以上面年龄排序为例
1.将第一个数21作为基准数,从队伍中站出来,队伍就空出了一个位,即形成了一个坑。
36 |
26 |
22 |
18 |
29 |
---|
i-> <-j
2.从后向前找比21小的或等于21年纪的人,找到后让这个人站到前一个空的位置,形成一个新的空位。
18 |
36 |
26 |
22 |
29 |
---|
i-> <-j
3.接着由前向后找比21年纪大或者等于21的人,找到后再让这个人站到前一个空的位置,又形成一个新的空位。
18 |
26 |
22 |
36 |
29 |
---|
i-> <-j
4.重复步骤2和3,直达前后标志位置i和j相遇,把基准数21放到i和j相遇的位置。
18 |
21 |
26 |
22 |
36 |
29 |
---|
5.把21两边的部分重复上边的排序步骤。
第一趟排序结果{1} 21 { 26 ,22,36,29}
第二趟排序 {1} 21 { ,22 ,36,29}
1,21 { 22 }26 {36,29}
第三趟排序 1,21 ,22 ,26 { ,29}
1,21 ,22 ,26 { 29 ,36}
最终结果:1,21 ,22 ,26 ,29 ,36
四
代码实现
public class Sort {
public static void main(String[] args) {
int array[]={21,36,26,22,18,29};
int start = 0;
int end = array.length - 1;
// 调用sort方法,排序
sort(array, start, end);
// 循环输出排序后的结果,看是否正确
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+"t");
}
}
public static void sort(int array[], int low, int high) {
// start是list的第一位,end是list的最后一位,start和end都是数组的下标位置;
int start = low;
int end = high;
// value作为基准值,取未排序的第一位作为基准值
// 算法大体思路,就是拿value和剩下的数比较,排序,
// value值前都比value小,value值后都比value大
int value = array[low];
while (end > start) {
// 从后往前比较,找到小于等于value的值
while (end > start && array[end] >= value) {
end--;
}
if (array[end] <= value) {
// 把找到的数放到前一个空位
int keyStarts = array[start];
array[start]=array[end];
array[end]= keyStarts;
}
// 从前往后比较,找到大于等于value的值
while (end > start && array[start] <= value){
start++;
}
if (array[start] >= value) {
// 同理把找到的数放到前一个空位
int keyStarts = array[start];
array[start]= array[end];
array[end]= keyStarts;
}
//左边递归调用
if (start > low){
sort(array, low, start - 1);
}
//右边递归调用
if (end < high){
sort(array, end + 1, high);
}
}
}
}
- Spring Batch:文件的批量读写Flatfile(XML,CSV,TXT)
- 项目本机部署过程中的若个问题
- Android View体系(十一)自定义ViewGroup
- Java并发编程(四)Java内存模型
- Android View体系(十)自定义组合控件
- 算法(一)时间复杂度
- Android Studio详细安装流程和配置、主题
- html5 jqueryrotate插件实现旋转动画
- 为什么要使用String
- Android网络编程(十一)源码解析Retrofit
- android Material Design详解
- android EventBus详解(三)
- Android绘制优化(一)绘制性能分析
- android EventBus详解(二)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- JavaScript 启动性能瓶颈分析与解决方案
- 大白话理解Vuex
- 【Java面试总结】计算机网络
- volatile关键字 Krains 2020-08-26
- synchronized关键字 Krains 2020-08-25
- happens-before Krains 2020-08-26
- ReentrantLock可重入锁 Krains 2020-08-27
- Java中的线程 Krains 2020-08-24
- CAS Krains 2020-08-25
- 96. 不同的二叉搜索树 II Krains 2020-09-03 树
- 410. 分割数组的最大值 Krains 2020-08-29 20:21:39 动态规划二分查找
- 字典树 Krains 2020-09-01
- redis学习(十)
- vue修改浏览器的标题title
- 天天基金网数据接口