快排将整个数组分为两部分,大于主元的在右边小于主元的在左边,这个操作可以通过单指针扫描来完成,也可以通过双指针扫描来完成,单指针扫描简单易理解,双指针扫描快一点。

通过对分区的操作,我才理解了快排的思想主要集中在数组的 分开 上, 而归并排序的时间主要花在了合并上。

代码如下;

package L3;import java.util.Arrays;public class L2 {// 快排一遍单向扫描法static int pv(int[] a, int l, int r) {int pivot = a[l];// 定主元int sp = l + 1;// 扫描指针int bigger = r;while (sp <= bigger) {if (a[sp] <= pivot)sp++;else {int t = a[sp];a[sp] = a[bigger];a[bigger] = t;bigger--;}}int t = a[l];a[l] = a[bigger];a[bigger] = t;System.out.println(Arrays.toString(a));return bigger;}// 快排双向扫描指针static int pv2(int[] a, int l, int r) {int pivot = a[l];int left = l + 1;// 左指针int right = r;// 右指针while (left <= right) {// left向右走,直到遇见大于主元的元素while (left <= right && a[left] <= pivot)left++;while (left <= right && a[right] > pivot)right--;if (left < right) {int t = a[left];a[left] = a[right];a[right] = t;}}// while退出时,两者交错,且right指向最后一个小于等于主元的元素,也就是主元应该呆的位置int t = a[l];a[l] = a[right];a[right] = t;System.out.println(Arrays.toString(a));return right;}static void quick(int[] a, int l, int r) {if (l < r) {int q = pv2(a, l, r);quick(a, l, q - 1);quick(a, q + 1, r);}}public static void main(String[] args) {// TODO Auto-generated method stubint[] a = { 1, 8, 0, 7, 5, 91, 12 };System.out.println(Arrays.toString(a));quick(a, 0, a.length - 1);System.out.println(Arrays.toString(a));}}

快排的单指针扫描和双指针扫描相关推荐

  1. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  2. 数据结构之排序【归并排序和快排的顶级优化和快排的三种原理的实现及分析】 内含动态演示图

    文章目录 引言: 1.归并排序(MergeSort) 2.快速排序的优化(顶级优化) 3.快速排序的三种思路的代码实现及分析 4.归并排序和快排第3原理的测试 引言: 刚刚去回顾了一下递归实现的几个小 ...

  3. 快排(动图详细版,快速理解)

    注:本文主要介绍六大排序中的快排 文章目录 前言 一.三大法则 1.1 Hoare法 1.2 挖坑法 1.3 双指针法(更加便捷) 1.4 三种方法时间复杂度计算 二.快排栈问题优化方式 2.1 三数 ...

  4. 单链表排序----快排 归并排序

    单链表排序----快排 & 归并排序 原文:http://blog.csdn.net/u012658346/article/details/51141288 题目描述:  给定一个乱序的单链表 ...

  5. leetcode每日一题825. 适龄的朋友 快排+双指针

    本文目录 leetcode每日一题825. 适龄的朋友 快排+双指针 写在前面 题目 示例 提示 思路 代码实现 执行结果 写在后面 leetcode每日一题825. 适龄的朋友 快排+双指针 写在前 ...

  6. 单轴快排(SinglePivotQuickSort)和双轴快排(DualPivotQuickSort)及其JAVA实现

    快速排序使用的是分治思想,将原问题分成若干个子问题进行递归解决.通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快 ...

  7. 基于单链表快排的优化算法

    快排大法好,不说日常数据处理的巨大优势,面试时能手写快排更是装X一大利器. 不过传统的快排有一大缺陷:当出现大量相同值或数据已经有序时,由于对相同值的重复递归,排序效率会急剧降低乃至O(N^2). 为 ...

  8. 【常考】408快排单函数简单模板(附注释+测试代码)

    纯净版(考试用) void QuickSort( int arr[], int low, int high ) {int temp;int i=low, j=high;temp = arr[low]; ...

  9. 分治法:快速排序,3种划分方式,随机化快排,快排快,还是归并排序快?

    快速排序不同于之前了解的分治,他是通过一系列操作划分得到子问题,不同之前的划分子问题很简单,划分子问题的过程也是解决问题的过程 我们通常划分子问题尽量保持均衡,而快排缺无法保持均衡 快排第一种划分子问 ...

  10. 堆排序和快排与归并排序

    目录 快速排序 算法思想 算法的优化 代码实现 归并排序 算法思想 算法优化 代码实现 堆排序 算法思想 代码实现 本文主要介绍了三个排序算法的思想原理和Java代码实现 快速排序 快排序的一个优点是 ...

最新文章

  1. 2019/5/12 查漏补缺
  2. ExtJS4.2:自定义主题 入门
  3. 嵌入式Linux驱动程序
  4. 如何防止android软件被反编译,破解盗版
  5. 阿里云引领云原生进化,智能、互联、可信三位一体
  6. javamail课设_JAVA MAIL实例讲解教程视频下载(16课程)
  7. 要找工作了,拿什么拯救你——我的能力
  8. 【渝粤题库】陕西师范大学200341实变函数作业(高起本、专升本)
  9. UVA 12298——Super Poker II
  10. 掩码 项目编码_每天进行20天的编码项目
  11. android socket 闪退,android客户端闪退
  12. explode php,php中的explode()函数实例介绍
  13. ZOJ 3867 Earthstone: Easy Version
  14. python的简单程序代码_有那些用python修改python程序代码的简单方法?
  15. xgboost算法_XGBoost 原理 及 常见面试题
  16. Mathematica图像处理
  17. vue结合videojs实现视频播放组件
  18. 如何在Android上查看本地空气质量指数
  19. 微信支付api unauthorized【已解决】
  20. 毕业后的档案问题——详细流程

热门文章

  1. (最小割求最小割集)poweroj2883病毒侵染
  2. 手机上怎么换证件照底色?手机一键照片改背景颜色
  3. (EXCEL VB初体验)EXCEL自动行高再加高,超详细
  4. 弹球小游戏c语言编程,scratch丨(1) 弹球小游戏
  5. 渗透测试技术----服务扫描(一)--Banner、服务版本扫描、操作系统识别
  6. 管理多个java版本,OS X中使用jEnv管理多个Java版本
  7. 困了累了到底喝啥?浅谈饮料品牌如何进行推广策略定位
  8. 40个笑到抽筋的神回复,哈哈哈哈哈...
  9. “水晶糖果字体”练习
  10. android输入法剪切板历史记录,Android Q 获取剪切板内容