java 集合快速排序_搞定Java快速排序
全文字数: 921
阅读时间: 3 分钟
1.简介?
快速排序(Quicksort),简称快排,是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1960年提出。它的基本思想分治法:即通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以使用递归实现。
2.算法思想?
快速排序算法的核心思想是分治法,先比大小,然后分区。下面我们通过生活中的一个例子来解释一下这个算法思想。假设一个房间中有六个人,排成了一队,他们的年纪分别是21,36,26,22,18,29。我们希望按照他们的年纪从小到达重新进行排列,快速排序的思想是,选一个人的年纪作为基准数,这里选21,然后让剩下的人分别和21比较,小于21的都站在他的左边,大于21的都站在他的右边,通过21把这些人分成了两部分,然后对这两部分重复上边的步骤,即选基准数比较,分成两部分,再重复。。。。。。
{。。。}21{。。。}
3.实现思路?
挖坑填数:以上面年龄排序为例
1.将第一个数21作为基准数,从队伍中站出来,队伍就空出了一个位,即形成了一个坑。
{ , 36 , 26 , 22 , 18 , 29 }
i->
2.从后向前找比21小的或等于21年纪的人,找到后让这个人站到前一个空的位置,形成一个新的空位。
{ 18 , 36 , 26 , 22 , , 29}
i->
3.接着由前向后找比21年纪大或者等于21的人,找到后再让这个人站到前一个空的位置,又形成一个新的空位。
{ 18 , , 26 , 22 , 36, 29 }
i->
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
4.代码实现?
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);
}
}
}
}
java 集合快速排序_搞定Java快速排序相关推荐
- 【Java多线程】轻松搞定Java多线程(一)
轻松搞定Java多线程(一) Java多线程详解(一) 1. 线程简介 2.线程的创建 2.1 三种创建方式 2.2 Thread 2.3 实现Runnable 2.3.1 初识并发问题 2.3.2 ...
- 百度统计 java 实现思路_搞定BAT之百度面经深度整理
点击上方蓝字关注我吧 准备百度的大数据开发面试的时候查了很多资料,找了很多面经,但是网上关于百度的面经比较少,所以最后把自己从各路大佬那里淘来的珍贵面经整理出来,也算回馈大家了. 我都汇总过了,题目很 ...
- java 内部类定于_搞懂 JAVA 内部类
前些天写了一篇关于 2018 年奋斗计划的文章,其实做 Android 开发也有一段时间了,文章中所写的内容,也都是在日常开发中遇到各种问题后总结下来需要巩固的基础或者进阶知识.那么本文就从内部类开刀 ...
- java 自旋锁_搞懂Java中的自旋锁
轻松搞懂Java中的自旋锁 前言 在之前的文章<一文彻底搞懂面试中常问的各种"锁">中介绍了Java中的各种"锁",可能对于不是很了解这些概念的同学 ...
- java定时器只执行一次_搞定Java并发:为什么说只有1种实现线程的方法?(下)...
在 上一篇(戳下看前情) 中,徐大带我们详细论证了,所有实现线程的方式归根结底就是基于 Runnable 接口或继承 Thread 类.接下来,请徐大继续解释,为什么说这两种方式本质上是一种. 一. ...
- 【Java】一文搞定Java反射技术
Java基础之反射 一.类加载器 1.类的加载 2.类的加载时机(进入内存) 3.类加载器 4.类加载器的组成 二.反射 1.Class类 2.通过反射获取构造方法并使用 三.反射练习 1.泛型擦除 ...
- 几周内搞定Java的10个方法
几周内搞定Java的10个方法 不要将Java与JavaScript弄混了,Java的目标是"一次编译,到处调试"(呃,不对,是"到处运行").简单来说, ...
- 白话经典算法系列之六 快速排序 快速搞定
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个 ...
- 4问教你搞定java中的ThreadLocal
摘要:ThreadLocal是除了加锁同步方式之外的一种保证规避多线程访问出现线程不安全的方法. 本文分享自华为云社区<4问搞定java中的ThreadLocal>,作者:breakDra ...
最新文章
- 在ionic/cordova中使用极光推送插件(jpush)
- linux/centos/集群安装ntp时间同步,自身实验成功
- Android 6.0 7.0 8.0 一个简单的app内更新版本-okgo app版本更新
- 【maven插件】maven-resources-plugin
- 数据中心不再有空调、风扇等冷却装置会怎样?
- 从oracle里面取直,45个非常有用的 Oracle 查询语句小结
- mongoose换成mysql_Package - tms-koa
- android模拟器太卡,安卓模拟器安装之后太卡怎么解决
- Vision Transformer太火!这门开源课也火了!十小时现场coding带你玩转ViT 爆款SOTA算法!...
- spark2.0配合hive0.13.1使用问题处理
- spring boot组件_Spring Boot Framework的关键组件和内部
- 【Cocos Creator实战教程(6)】——镜头跟随
- rocketdock皮肤_使用RocketDock皮肤获取Windows 7,Vista和XP中的Windows 8魅力栏
- Discuz安装短信宝短信插件教程
- 计算机开机硬件检查,开机bios检测硬件信息方法
- 数学基础:积分中值定理
- Houdini学习笔记——【案例二】消散文字制作
- mysql公司简介_MySQL简介
- SIMD、SIMD、SIMT、MISD、MIMD详解与比较
- 前端的组件化和模块化