快速排序

原理

快速排序(Quick Sort)算法,简称快排,利用的也是分治的思想,快排的思路是:如果要对 m->n 之间的数列进行排序,我们选择 m->n 之间的任意一个元素数据作为分区点(Pivot),然后我们遍历 m->n 之间的所有元素,将小于 pivot 的元素放到左边,大于 pivot 的元素放到右边,pivot 放到中间,这样整个数列就被分成三部分了,m->k-1 之间的元素是小于 pivot 的,中间是 pivot,k+1->n 之间的元素是大于 pivot 的。然后再根据分治递归的思想处理两边区间的的元素数列,直到区间缩小为 1,就说明整个数列都已有序了。

算法描述如下:

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序,直到区间缩小为1。

代码实现

public class QuickSort {public static void main(String[] args) {int[] arr = {5, 2, 6, 9, 0, 3, 4};quickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr, int begin, int end) {if (arr.length <= 1 || begin >= end) {return;}//进行分区得到分区下标int pivotIndex = partition(arr, begin, end);//分区左侧进行快排quickSort(arr, begin, pivotIndex - 1);//分区右侧进行快排quickSort(arr,pivotIndex+1,end);}public static int partition(int[] arr, int begin, int end) {//默认使用 最后一个元素作为基准点int pivot = arr[end];//定义分区后的pivot元素下标int pivotIndex = begin;for (int i = begin; i < end; i++) {判断如果该区间内如果有元素小于 pivot 则将该元素从区间头开始一直向后填充 有点类似选择排序if (arr[i] < pivot) {if (i > pivotIndex) {swap(arr,i,pivotIndex);}pivotIndex++;}}swap(arr,pivotIndex,end);//得到基准点return pivotIndex;}//交换元素public static void swap(int[] arr, int i, int j) {int temp = arr[j];arr[j] = arr[i];arr[i] = temp;}
}

1:快速排序的时间复杂度是多少?

快排的时间复杂度最好以及平均情况下的复杂度都是 O(nlogn),只有在极端情况下会变成 O(n^2)。

2:快速排序的空间复杂度是多少?

通过快排的代码实现我们发现,快排不需要额外的存储空间,所有的操作都能在既定的空间内完成,因此快排的空间复杂度为 O(1),也就是说快排是一种 in-place的排序算法。

3:快速排序是稳定的排序算法吗?

因为分区的过程涉及交换操作,如果数组中有两个相同的元素,比如序列 6,8,7,6,3,5,9,4,在经过第一次分区操作之后,两个 6 的相对先后顺序就会改变。所以,快速排序并不是一个稳定的排序算法。

4:快排和归并的异同

首先快排和归并都用到了分治递归的思想,在快排中对应的叫分区操作,递推公式和递归代码也非常相似,但是归并排序的处理过程是由下到上的由局部到整体,先处理子问题,然后再合并。而快排正好相反,它的处理过程是由上到下由整体到局部,先分区,然后再处理子问题。归并排序虽然是稳定的、时间复杂度为 O(nlogn) 的排序算法,但是它是一种 out-place 排序算法。主要原因是合并函数无法在原地(数组内)执行。快速排序通过设计巧妙的原地(数组内)分区函数,可以实现原地排序,解决了归并排序占用太多内存的问题。

排序算法---快速排序(java版)相关推荐

  1. 经典排序算法(Java版)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 经典排序 ...

  2. 八大经典排序算法(java版)

    这里写目录标题 交换算法之冒泡排序 交换算法之快速排序 插入算法之插入排序 插入排序之希尔排序 选择排序之简单选择排序 排序算法之归并排序 排序算法之基数排序 常用排序算法之堆排序 交换算法之冒泡排序 ...

  3. 十大排序算法入门(JAVA版)

    文章目录 前言 ❤️冒泡排序

  4. 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】

    经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话   ...

  5. Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID (Java版)

    分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一 ...

  6. 内部排序比较(Java版)

    内部排序比较(Java版) 2017-06-21 目录 1 三种基本排序算法 1.1 插入排序 1.2 交换排序(冒泡) 1.3 选择排序(简单) 2 比较 3 补充 3.1 快速排序 3.2 什么是 ...

  7. 八大排序算法的java实现

    八大排序算法的java实现 有时间再贴算法分析图 JDK7的Collections.sort()的算法是TimSort, 适应性的归并排序, 比较晦涩难懂, 这里没有实现 public class m ...

  8. java 3 9 2 6数字排序_GitHub - JourWon/sort-algorithm: 史上最全经典排序算法总结(Java实现)...

    史上最全经典排序算法总结(Java实现) 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗, ...

  9. 几种简单的排序算法(JAVA)

    几种排序算法(JAVA) 一.代码 package com.hdwang;import java.util.Arrays;/*** Created by admin on 2017/1/20.*/ p ...

  10. 十大排序算法(Java)

    文章目录 十大排序算法(Java) 一.冒泡排序(Bubble Sort) 二.选择排序(Selection Sort) 三.堆排序(Heap Sort) 四.插入排序(Insertion Sort) ...

最新文章

  1. SYNCHRO 4D可视化调度学习教程 SYNCHRO 4D: Visual Scheduling
  2. 区块链相关论文研读5:分布式隐私保护可审计的账本,zkLedger
  3. 大促系统全流量压测及稳定性保证——京东交易架构
  4. php mysql 获取错误_php怎样获取mysql错误信息
  5. 经典网页设计:18个示例展示图片在网页中的使用
  6. camel apache_如何使用Apache Camel,Quarkus和GraalVM快速运行100个骆驼
  7. java day06【类与对象、封装、构造方法】
  8. [转]WebService压缩
  9. linux中的命令ls -1,Linux常用命令 ls 入门基础知识
  10. 目前国内汉语自动分词系统的研究现状
  11. 电脑重启桌面 计算机图标消失,电脑重启桌面图标不见了怎么办
  12. python找不同_用Python玩大家来找茬
  13. 自动控制原理之控制系统的数学模型(类比神经网络学习数学模型)
  14. ios 扫描本地音乐_iOS 获取 媒体资料库里的音乐(本地音乐)
  15. android备忘录的开发总结报告,android备忘录
  16. 2020线上夏令营感受
  17. L1-030——一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。
  18. Bing Test -必应每日壁纸自动换
  19. E420笔记本升级固态硬盘
  20. 量子计算机如何预知未来,刘慈欣《镜子》中量子计算机成真?科学家计划用数学预测宇宙未来...

热门文章

  1. ajax提交无反应,IE中jquery.form中ajax提交没反应解决方法分享
  2. poj3484详解(二分)
  3. Win Ser 2008/2012 (R2) + NVIDIA Optimus 笔记本显卡
  4. AntiXSS - 支持Html同时防止XSS攻击
  5. MySQL-自定义函数
  6. Unity3D热更新LuaFramework入门实战
  7. MapReduce1和Yarn的工作机制
  8. CSS3透明属性opacity
  9. RewriteCond和13个mod_rewrite应用举例Apache伪静态
  10. 块代码编程---开始使用块代码