• 得出结论:

如果选取最左边的数arr[left]作为基准数,那么先从右边开始可保证i,j在相遇时,相遇数是小于基准数的,交换之后temp所在位置的左边都小于temp。但先从左边开始,相遇数是大于基准数的,无法满足temp左边的数都小于它。所以进行扫描,要从基准数的对面开始。(注:左右相对来说,也可前后)

  • 代码验证:

现选取最左边的数arr[left]作为基准数,即从右边开始扫描(哨兵j 先出动)

/*** 实现快速排序: 基准数归位的过程** @param arr* @param left* @param right*/public void quickSort(long[] arr, int left, int right) {int i = 0;int j = 0;long pivot = 0;long tmp = 0;if(left >= right) {return;}i = left;j = right;// refer存储基准数(初始化为数组第一个数,即左边)pivot = arr[left];// 当i = j (即相遇)时跳出循环while (i < j) {// 注意找的顺序,右边扫描// 先从右往左找(找到小于基准数)while (i < j && pivot <= arr[j]) {// 往左找j--;}// 再从左往右找(找到大于基准数)while (i < j && pivot >= arr[i]) {// 往右找i++;}// 当i 与 j 没有相遇if (i < j) {// 交换两个数的位置tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}}// 此时i = j 相遇了// 最终将基准数的位置与i=j相遇的位置交换arr[left] = arr[i];// 基准数归位arr[i] = pivot;// 递归排序,对左边的子数组进行快速排序quickSort(arr,left, i - 1);// 对右边的子数组进行快速排序quickSort(arr,i + 1, right);}

《啊哈!算法》 关于快速排序法为什么一定要哨兵j 先出动的原因?相关推荐

  1. PHP冒泡排序算法和快速排序法

    算法说明: 冒泡排序大概的意思是依次比较相邻的两个数,然后根据大小做出排序,直至最后两位数.由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序.但其实在实际过程中也可以根据 ...

  2. 经典算法之快速排序法(附B站最细讲解视频)

    活动地址:21天学习挑战赛 文章目录 一.算法 1.算法概述 2.算法步骤 3.算法特点 二.算法实践 1.Java代码 2.执行结果 3.讲解视频 三.复杂度分析 1.时间复杂度 2.空间复杂度 一 ...

  3. 【JavaScript算法】---快速排序法

    一.快速排序法概念 我们将一个杂乱无章的数组进行一个快速排序,可以先从一个数组中取一个中间值,将一个数组一分为2,左边的数组跟中间值进行比较,小的放在左边,大的放在右边.比较完毕后再次取中间值,再次比 ...

  4. 坐在马桶上看算法:快速排序

    坐在马桶上看算法:快速排序<?xml version="1.0" encoding="UTF-8"?> 坐在马桶上看算法:快速排序    高快省的排 ...

  5. 坐在马桶上看算法:快速排序(过程图解)

    比较了好多"快排"的解说,还是这个"哨兵"的方式最容易理解. 虽然文章通篇文字没什么图片,也没什么色彩,但是一定要坚持看完整篇文章,真的会豁然开朗,心情超爽!! ...

  6. 快速排序为何先要从右向左查找的原因

    假设我们现在对"6 1 2 7 9 3 4 5 10 8"这个10个数进行排序.首先在这个序列中随便找一个数作为基准数.为了方便,就让第一个数6作为基准数吧.接下来,需要将这个序列 ...

  7. php四种基础算法:冒泡,选择,插入和快速排序法

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要 ...

  8. 算法之旅 | 快速排序法

    HTML5学堂-码匠:前几期"算法之旅"跟大家分享了冒泡排序法和选择排序法,它们都属于时间复杂度为O(n^2)的"慢"排序.今天跟大家分享多种排序算法里使用较广 ...

  9. 本题要求实现一个用选择法对整数数组进行简单排序的函数。_通俗易懂讲 Python 算法:快速排序...

    原文:https://stackabuse.com/quicksort-in-python/ 作者:Marcus Sanatan 译者:老齐 欢迎在 bilibili  搜索 freeCodeCamp ...

最新文章

  1. CentOS配置网关服务器
  2. 【计算机网络】应用层 : 万维网 和 HTTP 协议 ( 万维网概述 | HTTP 协议特点 | HTTP 协议连接方式 | HTTP 协议报文结构 | HTTP 请求报文 | HTTP 响应报文 )
  3. vue使用better-scroll实现下拉刷新、上拉加载
  4. SQL注入-布尔盲注
  5. Y15BeTa蜂鸣器-演奏版-简化版
  6. JavaScript: The Good Parts 学习随笔(三)
  7. 云信服务器代码,网易云通信ID-服务端API文档-IM即时通讯-网易云信开发文档
  8. 鸿蒙不是Linux也不是安卓
  9. CVPR2021:Found a Reason for me? Weakly-supervised Grounded Visual Question Answering using Capsules
  10. 逍遥模拟器上传服务器文件,逍遥模拟器后台操作
  11. opencv 图像拼接和图像融合技术
  12. 为什么所有APP都想访问你的通讯录?
  13. try的动词用法_try的用法都有什么
  14. PTA题目 到底是不是太胖了
  15. 知识分享·NLP中一些有趣的trick
  16. iOS app跳转到设置权限页面
  17. linux驱动环境搭建
  18. 思科交换机:vtp协议
  19. python excel 特定单元格加背景颜色 wlxt rlxt
  20. 记录下服务器电源的功率计算

热门文章

  1. 研发管理-通过任务带动
  2. 新兴国家战略级安全话题-软件供应链安全
  3. Java:利用字母可以组成一些美丽的图形,下面给出了一个例子:ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC这是一个5行7列的图形,请找出这个图形的规律
  4. iOS设置某个界面强制横屏,进入就横屏
  5. android7.0新特性 tv,NV老款Shield TV获更新:Android7.0/4K HDR支持
  6. Orleans 基础示例
  7. c语言子函数返回值,C语言函数说明与返回值
  8. 智能交通|飞凌嵌入式A40i核心板在智能驾考终端中的应用
  9. 广州2023 Qcon回顾
  10. ntp服务器时钟同步