《啊哈!算法》 关于快速排序法为什么一定要哨兵j 先出动的原因?
得出结论:
如果选取最左边的数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 先出动的原因?相关推荐
- PHP冒泡排序算法和快速排序法
算法说明: 冒泡排序大概的意思是依次比较相邻的两个数,然后根据大小做出排序,直至最后两位数.由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序.但其实在实际过程中也可以根据 ...
- 经典算法之快速排序法(附B站最细讲解视频)
活动地址:21天学习挑战赛 文章目录 一.算法 1.算法概述 2.算法步骤 3.算法特点 二.算法实践 1.Java代码 2.执行结果 3.讲解视频 三.复杂度分析 1.时间复杂度 2.空间复杂度 一 ...
- 【JavaScript算法】---快速排序法
一.快速排序法概念 我们将一个杂乱无章的数组进行一个快速排序,可以先从一个数组中取一个中间值,将一个数组一分为2,左边的数组跟中间值进行比较,小的放在左边,大的放在右边.比较完毕后再次取中间值,再次比 ...
- 坐在马桶上看算法:快速排序
坐在马桶上看算法:快速排序<?xml version="1.0" encoding="UTF-8"?> 坐在马桶上看算法:快速排序 高快省的排 ...
- 坐在马桶上看算法:快速排序(过程图解)
比较了好多"快排"的解说,还是这个"哨兵"的方式最容易理解. 虽然文章通篇文字没什么图片,也没什么色彩,但是一定要坚持看完整篇文章,真的会豁然开朗,心情超爽!! ...
- 快速排序为何先要从右向左查找的原因
假设我们现在对"6 1 2 7 9 3 4 5 10 8"这个10个数进行排序.首先在这个序列中随便找一个数作为基准数.为了方便,就让第一个数6作为基准数吧.接下来,需要将这个序列 ...
- php四种基础算法:冒泡,选择,插入和快速排序法
许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要 ...
- 算法之旅 | 快速排序法
HTML5学堂-码匠:前几期"算法之旅"跟大家分享了冒泡排序法和选择排序法,它们都属于时间复杂度为O(n^2)的"慢"排序.今天跟大家分享多种排序算法里使用较广 ...
- 本题要求实现一个用选择法对整数数组进行简单排序的函数。_通俗易懂讲 Python 算法:快速排序...
原文:https://stackabuse.com/quicksort-in-python/ 作者:Marcus Sanatan 译者:老齐 欢迎在 bilibili 搜索 freeCodeCamp ...
最新文章
- CentOS配置网关服务器
- 【计算机网络】应用层 : 万维网 和 HTTP 协议 ( 万维网概述 | HTTP 协议特点 | HTTP 协议连接方式 | HTTP 协议报文结构 | HTTP 请求报文 | HTTP 响应报文 )
- vue使用better-scroll实现下拉刷新、上拉加载
- SQL注入-布尔盲注
- Y15BeTa蜂鸣器-演奏版-简化版
- JavaScript: The Good Parts 学习随笔(三)
- 云信服务器代码,网易云通信ID-服务端API文档-IM即时通讯-网易云信开发文档
- 鸿蒙不是Linux也不是安卓
- CVPR2021:Found a Reason for me? Weakly-supervised Grounded Visual Question Answering using Capsules
- 逍遥模拟器上传服务器文件,逍遥模拟器后台操作
- opencv 图像拼接和图像融合技术
- 为什么所有APP都想访问你的通讯录?
- try的动词用法_try的用法都有什么
- PTA题目 到底是不是太胖了
- 知识分享·NLP中一些有趣的trick
- iOS app跳转到设置权限页面
- linux驱动环境搭建
- 思科交换机:vtp协议
- python excel 特定单元格加背景颜色 wlxt rlxt
- 记录下服务器电源的功率计算
热门文章
- 研发管理-通过任务带动
- 新兴国家战略级安全话题-软件供应链安全
- Java:利用字母可以组成一些美丽的图形,下面给出了一个例子:ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC这是一个5行7列的图形,请找出这个图形的规律
- iOS设置某个界面强制横屏,进入就横屏
- android7.0新特性 tv,NV老款Shield TV获更新:Android7.0/4K HDR支持
- Orleans 基础示例
- c语言子函数返回值,C语言函数说明与返回值
- 智能交通|飞凌嵌入式A40i核心板在智能驾考终端中的应用
- 广州2023 Qcon回顾
- ntp服务器时钟同步