快速排序的基本思想:
通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,比另一部分的关键字大,则科分别对这两部分记录继续进行排序,以达到整个序列有序,单路没有考虑到相等的问题

时间复杂度:O(nlog2n)
空间复杂度:O(1)
稳定性:不稳定

三路快速排序的话是两路快速排序的一种优化
具体如下:

比如待排序的数组如下:
我们定义一个l指向数组的第一个元素,r指向数组的最后一个元素,组成一个区间

三路快速排序思路:


从指针i开始,与关键字进行比较,
如果小于关键字的话,就将I和lt+1的元素进行一个交换,换完之后将进行i++,lt++

小于的情况如下:

如果等于关键字的话,就直接i++,向后移动
等于的情况如下:

如果大于关键字的话,将i和gt-1的元素和i进行交换,换完之后,gt–
当我们的gt大于等于我们的i时排序结束
因为当前i和gt-1同时指向我们的6同一个元素,所以也是进行了一个交换
我们发现i和gt相等,所以第一次排序结束

最后将V和lt的原素即小于我们的这个关键字的区间的最后一个元素进行一个交换

继续向下递归,之前小于关键字的部分作为一个需要排序的数组,大于关键字的部分也作为一个需要排序的数组,与关键字相同的部分就不再进行排序,

最后我们箭头所指向的元素就是我们的排序后的数组了

整个递归代码如下:

package com.sj.dt;import java.util.Arrays;public class QuickSortThreeway {public static void main(String[] args) {int[] arr= {4,1,4,1,4,5,6,3};quickSortThreeWay(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}public static void quickSortThreeWay(int [] arr,int l,int r) {if(l>=r) {return;}swap(arr,l,(int)(Math.random()*(r-l+1)+l));int v=arr[l];int lt=l;int gt=r+1;int i=lt+1;while(i<gt) {if(arr[i]<v) {//小于关键字的区间swap(arr,i,lt+1);i++;lt++;}else if(arr[i]>v) {//大于关键字的区间swap(arr,i,gt-1);gt--;}else {//等于关键字的区间i++;}}swap(arr,l,lt);//最后将关键字和lt的元素进行交换//进行下一层递归,排序quickSortThreeWay(arr,l,lt-1);quickSortThreeWay(arr,gt,r);}private static void swap(int []arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}}

运行结果:

[1, 1, 3, 4, 4, 4, 5, 6]

快速排序(递归)-三路快速排序(图解)及代码相关推荐

  1. 双路快速排序以及三路排序算法

    目录 双路快速排序 一.概念及其介绍 二.适用说明 三.过程图示 四.Java 实例代码 三路排序算法 一.概念及其介绍 二.适用说明 三.过程图示 四.Java 实例代码 双路快速排序 一.概念及其 ...

  2. 数据结构与算法(一):排序算法之 - 快速排序(详细步骤图解,附代码)

    快速排序 引子:Partition 过程 给定一个数组arr,和一个整数num.请把小于等于num的数放在数组的左边,大于num的数放在数组的右边. 要求额外空间复杂度O(1),时间复杂度O(N) 思 ...

  3. 快速排序 递归版本和非递归方法 c代码

    快速排序平均时间是T(n) =knln(n),其中n为待排序序列中记录个数,k为某个常数.通常,快速排序被认为是,在所有同数量级(O(nlogn))的排序方法中,其平均性能最好,但是,若初始记录按关键 ...

  4. 排序算法 | 快速排序,算法的图解、实现、复杂度和稳定性分析与优化

    今天讲解一下快速排序算法的原理以及实现.复杂度和稳定性分析与优化 目录 1 快速排序的原理 2 快速排序代码实现 3 复杂度和稳定性分析.优化 4 习题练习 1 快速排序的原理 快速排序是所有内部排序 ...

  5. 插入排序、选择排序、快速排序以及归并排序(附Python代码)

    排序算法基本原理以及复杂度等知识点可跳转至该博客了解https://www.cnblogs.com/onepixel/p/7674659.html ,本博客主要对排序算法性能进行对比以及记录对比过程发 ...

  6. 快速排序非递归算法c语言实现,数据结构与算法----3.5 非递归的快速排序方法

    [c++]代码库#include using namespace std; #include using namespace std; typedef int KeyType; struct LEle ...

  7. 冒泡排序+快速排序+选择排序(图解)

    冒泡排序 原理 假设有10个数,第一轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动:接着第二个数和第三个数比较,如果第二个数大,第二个数和第三个数交换位置,否则不 ...

  8. 排序算法 快速排序【详细步骤图解】

    排序算法 快速排序[详细步骤图解] 快速排序 主要思想 图解 第一轮分割序列 第二轮分割序列 --- 左子序列 小结 第三轮分割序列 --- 右子序列 C++实现 总结 快速排序 给定一个序列:22 ...

  9. 史上最清晰的三路快速排序

    更多精彩文章,请关注公众号[程序员小熊]. 排序算法不论是在刷题还是面试都经常遇到,掌握它能提升自己的算法功力从而增加自己面试通过的几率. 本文主要介绍一下三路快排,并以微软的一道面试题 leetco ...

  10. 玩转快速排序(递归+非递归)

    1.基本思想 通过一趟排序将要排序的数据分割成独立的两部分,其中左边的元素值都要小于等于基准值,右边的元素都要大于等于基准值,然后再按此方法对这两部分数据分别进行快速排序.整个排序过程可以递归进行,以 ...

最新文章

  1. 这样讲 SpringBoot 自动配置原理,你应该能明白了吧
  2. 网络营销外包——网络营销外包新手如何理解优化对网络营销的重要性?
  3. boost::math::inverse_chi_squared用法的测试程序
  4. 读取csv绘制直方图_[python]用tushare接口绘制Bollinger Bands
  5. DinamicX 详解:如何让盲人也能在线购物?
  6. 中国35位“大国工匠”榜单出炉!西工大、西电合计占半壁江山!清华仅1人!...
  7. JAVA代码实现按列表中元素的时间字段排序
  8. 解释什么是快速排序算法?_解释排序算法
  9. spring map使用annotation泛型注入问题分析
  10. 用C#製作PDF文件全攻略
  11. Java集合继承关系图
  12. es6中一些基本的使用方法
  13. 32位程序使用超过4G的内存
  14. 【汇正财经】股本的法律规范
  15. OpenCV基本函数学习
  16. vue接口总是请求超时_vue-resource请求超时timeout设置
  17. 软件实训-用例图2.0 + 简单用例描述
  18. spring中tx:advice中的tx是什么的缩写?
  19. 蓝汛之获取DAC输出能量【篇】
  20. python出现 'ascii' codec can't decode byte 0xXX in position XX: ordinal not in range(128)问题

热门文章

  1. LeetCode—3.双指针算法—对撞指针与快慢指针及其leetcode题
  2. MySQL必知必会(一)
  3. Leetcode重点题
  4. 揭秘React同构应用
  5. 为什么选择Netty作为基础通信框架?
  6. 【转】如何防止softmax函数上溢出(overflow)和下溢出(underflow)
  7. cnpm 没反应_世界上“最蠢”的鱼, 被吃了一半还没反应, 但永远不会灭绝
  8. ubuntu 启动时显示initramfs 无法进入系统
  9. Android SQL删除表、清空表
  10. 安卓recovery如何传递启动参数