java快排原理_Java数据结构与算法——快速排序
声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。
前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本篇文章介绍排序算法中最常用也是面试中最容易考到的排序算法——快排,包括快排的思想和原理、java快排代码、快排的特点性能和快排的适用场景。
0、其他排序算法索引(待更)
1、快速排序思想及原理
事实上,快速排序是堆冒泡排序的一种改进。
它的基本思想是:通过一趟排序将要排序的数据分割为两部分,第一部分所有数据比第二部分的所有数据小,按照这种思路将两部分数据再次分别进行快速排序,可以使用递归完成,最终使得整个数据序列有序。
具体来讲,在待排数据中找一个基准数据(通常取第一个数),接下来将待排数据中比基准数据小的放在待排数据的左侧,将比待排数据中比基准数据大的放在待排数据右侧。此时,左右两个分区的元素相对有序,接着采用上述思路继续对左右两个分区继续排序,直到各分区只有一个元素位置。这里用到了一个典型的分治思想。下面举例说明:
待排序列依次为47、29、71、99、78、19、24、47。为了区分两个47,将后面的47下面增加一个下划线。
步骤:
1、选取一个基准数,一般选第0个元素47。
2、将比基准数小的移动到左侧,比基准数大的移动到右侧,相等的不移动,此时基准数位置为K。
3、对左右两侧重复步骤1和步骤2,直到左右侧细分到只有一个元素。
快排的难点也就是在第2步,怎么移动各个数据?
<1> 首先从数列的右边开始往左找,设下标为i,也就是i--操作,找到第一个比基准数小的值,让他与基准数交换;
<2> 接着开始从左往右找,设下标为j,也就是j++,找到第一个比基准数大的值,让他与基准数交换位置;
<3> 重复1和2,直到i和j相遇时结束,最后基准值所在位置为k。
2、java快排代码
public class QuickSort {
private int[] array;
public QuickSort(int[] array){
this.array = array;
}
public void printSort(){
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
public void sort(){
quicksort(array,0,array.length -1);
}
private void quicksort(int[] array,int begin,int end){
if(begin
int base = array[begin]; //取第一个值为基准值
int i = begin; //左标记为i
int j = end; //右标记为j
//一趟排序,找到比基准值大的在基准值右,比基准值小的在基准值左
while(i
//从右往左扫描
while(ibase){ //从右往左扫,如果元素比基准值大
j--; //则右边标记--,直到找到第一个比基准值小的,停止扫描
}
if(i
array[i]=array[j]; //交换右扫描第一个比基准值小的数
i++; //i标记右移一位
}
//从左往右扫描
while(i
i++; //则左标记++,直到找到第一个比基准值大的,停止扫描
}
if(i
array[j]=array[i]; //交换左扫描第一个比基准值大的数
j--; //j标记左移一位
}
} //此时基准值左右两侧相对有序
array[i] = base; //此时i为中间位置k
quicksort(array,begin,i-1); //左侧按照快排思路,递归
quicksort(array,i+1,end); //右侧按照快排思路,递归
}
}
}
测试代码
public class SortTest {
public static void main(String[] args) {
teseQuickSort();
}
private static void teseQuickSort(){
int[] array = {3,5,7,3,8,9,6,1,0};
QuickSort qs = new QuickSort(array);
qs.sort();
qs.printSort();
}
}
3、快排的特点及性能
快排是在冒泡排序之上改进而来的,冒泡排序每次只能交换相邻的两个元素,而快排则是跳跃式的交换,交换距离很大,总的比较次数和交换次数少了很多,速度也快了很多。
快排的平均时间复杂度为O(nlogn),事实上,大多数情况下,排序速度要快于这个时间复杂度。快排实际上是采用的一种分而治之的思想,把问题分解为一个个的小问题去逐一解决,最终在把结果组合起来。
快排因为递归调用,所以空间复杂度为O(logn)。
快排是一种不稳定的排序算法,在经过排序后,等值的元素的相对位置可能发生改变。
快排基本上被认为是相同数量级中所有排序算法中平均性能最好的。
4、快排的适用场景
快排由于相对简单而且性能不错,所以快排适用于几乎绝大多数场合。
码字不易,如对您有帮助,欢迎点赞收藏打赏^_^
java快排原理_Java数据结构与算法——快速排序相关推荐
- java 二维链表_Java数据结构与算法----数组与链表
数据类型 1 数据类型介绍 数据类型的分类(按照结构划分):线性结构和非线性结构 线性结构:线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序 ...
- java快排原理_快速排序原理及实现(java)
高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 9 3 4 5 1 ...
- java快排算法解读,java 快排的思路与算法
java 快排的思路与算法 有时候面试的时候的会问道Arrays.sort()是怎么实现的,我以前根本不知道是什么东西,最近点进去看了一下.直接吓傻, //看到这个时候还是比较淡定的,可怕的事情来了. ...
- 算法——java快排(快速排序)
手写java快排(快速排序)代码--双边循环法,本人亲测哈哈!! package com.abc.backend.algo;import java.util.Arrays;/*** 快排(双边循环法) ...
- 搜索引擎SEO发包快排原理【SEO内行解密】
在说这个搜索引擎快排原理之前,我先来说说百度前几年发布的<惊雷算法>规则,这个规则里面百度明确的说明了,禁止站长通过网站点击.模拟点击等类似点击的手段来快速上排名,对这类的打击力度非常大. ...
- java数据结构排序实验报告_java数据结构与算法之插入排序详解
本文实例讲述了java数据结构与算法之插入排序.分享给大家供大家参考,具体如下: 复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅. ...
- java数据结构 队列_Java数据结构与算法[原创]——队列
声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...
- Java快排算法详解
快排算法底层基本思想: 先取出数列中的第一个数作为基准数. 将数列中比基准数大的数全部放在他的右边,比基准数小的数全部放在它的左边. 然后在对左右两部分重复第二步,直到各个区间只有一个数. 具体Jav ...
- java stack 从1.5开始?_java数据结构与算法之栈(Stack)设计与实现
本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 栈是一种用于存储数据的简单数据结构,有点类似链表或者顺序表(统称线性表),栈与线 ...
最新文章
- 对比 MySQL 的 Binlog 日志处理工具
- JRebel : java.lang.OutOfMemoryError: PermGen space 异常
- ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
- 从无盘启动看 Linux 启动原理
- python tkinter火柴人_趣学Python编程
- Unity 网络编程(Socket)应用
- java多态的理解(运行时多态)_Java多态的理解
- (原创)RHEL/CentOS 5.x使用yum快速安装MySQL 5.5.x
- Play和Grails Java框架的优缺点
- 【周记:距gdoi43天】
- 如何在docker中运行MySQL实例(转载)
- pytorch对数据集进行重新采样
- java aws批量_通过 S3 Batch Operations (批量操作)功能轻松处理海量对象
- 基于matlab的暴雨强度公式参数推求,小样本流域降雨强度公式和设计降雨分布的推求方法...
- ANDROID仿淘宝商品浏览滑(拖)动查看详情界面
- 开启Google Chrome浏览器加速模式
- 学机器学习怎么可以不知道最小二乘法
- 微信公众号接入百度天气API接口实现代码
- mysql 串行化_MySQL事务的可串行化
- 虚拟机 服务器死机,VMware虚拟机开机卡死黑屏,进不了系统解决办法
热门文章
- Java ThreadLocal
- P3403 跳楼机 同余最短路
- HDU6218 2017ACM/ICPC亚洲区沈阳站 Bridge(Set,线段树)
- P4245 【模板】任意模数多项式乘法(NTT)
- P1064 [NOIP2006 提高组] 金明的预算方案
- 牛客题霸 [判断二叉树是否对称] C++题解/答案
- nssl1469-W【dp】
- P6047-丝之割【斜率优化,dp】
- Codeforces Round #666 (Div. 2)
- 【线段树】Serious Business(CF1648D)