原理:

   快速排序,说白了就是给基准数据找其正确索引位置的过程.
   如下图所示,假设最开始的基准数据为数组第一个元素23,则首先用一个临时变量去存储基准数据,即tmp=23;然后分别从数组的两端扫描数组,设两个指示标志:low指向起始位置,high指向末尾.

   首先从后半部分开始,如果扫描到的值大于基准数据就让high减1,如果发现有元素比该基准数据的值小(如上图中18<=tmp),就将high位置的值赋值给low位置 ,结果如下:

然后开始从前往后扫描,如果扫描到的值小于基准数据就让low加1,如果发现有元素大于基准数据的值(如上图46=>tmp),就再将low位置的值赋值给high位置的值,指针移动并且数据交换后的结果如下:

然后再开始从后向前扫描,原理同上,发现上图11<=tmp,则将low位置的值赋值给high位置的值 ,结果如下:
然后再开始从后向前扫描,原理同上,发现上图11<=tmp,则将high位置的值赋值给low位置的值,结果如下:

然后再开始从前往后遍历,直到low=high结束循环,此时low或high的下标就是基准数据23在该数组中的正确索引位置.如下图所示.

  这样一遍走下来,可以很清楚的知道,其实快速排序的本质就是把基准数大的都放在基准数的右边,把比基准数小的放在基准数的左边,这样就找到了该数据在数组中的正确位置.
  以后采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。

一些小结论

从上面的过程中可以看到:

  ①先从队尾开始向前扫描且当low < high时,如果a[high] > tmp,则high–,但如果a[high] < tmp,则将high的值赋值给low,即arr[low] = a[high],同时要转换数组扫描的方式,即需要从队首开始向队尾进行扫描了
  ②同理,当从队首开始向队尾进行扫描时,如果a[low] < tmp,则low++,但如果a[low] > tmp了,则就需要将low位置的值赋值给high位置,即arr[low] = arr[high],同时将数组扫描方式换为由队尾向队首进行扫描.
  ③不断重复①和②,知道low>=high时(其实是low=high),low或high的位置就是该基准数据在数组中的正确索引位置.

按照上诉理论我写的代码如下:

package com.nrsc.sort;public class QuickSort {public static void main(String[] args) {int[] arr = { 49, 38, 65, 97, 23, 22, 76, 1, 5, 8, 2, 0, -1, 22 };quickSort(arr, 0, arr.length - 1);System.out.println("排序后:");for (int i : arr) {System.out.println(i);}}private static void quickSort(int[] arr, int low, int high) {if (low < high) {// 找寻基准数据的正确索引int index = getIndex(arr, low, high);// 进行迭代对index之前和之后的数组进行相同的操作使整个数组变成有序//quickSort(arr, 0, index - 1); 之前的版本,这种姿势有很大的性能问题,谢谢大家的建议quickSort(arr, low, index - 1);quickSort(arr, index + 1, high);}}private static int getIndex(int[] arr, int low, int high) {// 基准数据int tmp = arr[low];while (low < high) {// 当队尾的元素大于等于基准数据时,向前挪动high指针while (low < high && arr[high] >= tmp) {high--;}// 如果队尾元素小于tmp了,需要将其赋值给lowarr[low] = arr[high];// 当队首元素小于等于tmp时,向前挪动low指针while (low < high && arr[low] <= tmp) {low++;}// 当队首元素大于tmp时,需要将其赋值给higharr[high] = arr[low];}// 跳出循环时low和high相等,此时的low或high就是tmp的正确索引位置// 由原理部分可以很清楚的知道low位置的值并不是tmp,所以需要将tmp赋值给arr[low]arr[low] = tmp;return low; // 返回tmp的正确位置}
}

快速排序---(面试碰到过好几次)相关推荐

  1. 社招2017-阿里、网易、滴滴共十次前端面试碰到的问题

    前一段时间一直在不断地面试,无奈个人技术能力有限.项目经验缺乏,最终都没有进入到HR面试环节,全~~挂~~了~~ 面试了这么多,结果不是太好,有点儿受打击,也促使我近期静下心来反思自己的问题:哪些技术 ...

  2. 阿里、网易、滴滴共十次前端面试碰到的问题

    原文链接:https://segmentfault.com/a/1190000009662029 前一段时间一直在不断地面试,无奈个人技术能力有限.项目经验缺乏,最终都没有进入到HR面试环节,全~~挂 ...

  3. 一次有趣的面试经历,当前端面试碰到后端面试官会发生什么?

    前言 金九银十,又是一年跑路季.先介绍下个人情况,一年半经验,计算机专业的大专.凭着对前端的热爱,基本每天都会抽点时间来学习,基础还算可以.其实上家公司呆着还是挺舒服的,没有加班,唯一不好就是不偏技术 ...

  4. 今天去面试碰到到一个问题

    今天去一家公司面试,遇到了一个面试题,一下子没想出来,现在拿出来分享下 给定一个数组,数组的元素只可能是整数,但数组中可能又包含了数组, 如$arr=array(23,87,array(222,53, ...

  5. 面试碰到这个算法:字母异位词分组

    题目:输入: ["eat", "tea", "tan", "ate", "nat", "b ...

  6. 《剑指offer》序——面试流程及面试须知

    通常,面试是从电话面试开始的.接下来可能有一两轮共享桌面远程面试,面试官通过桌面共享软件远程考查应聘者的编程和调试能力.如果应聘者的表现足够优秀,那么公司将邀请他到公司去接收现场面试. 通常,面试官会 ...

  7. 面试问题汇总 精选 分析 解答 职业规划 part 2

    面试困惑问与答(2)--感觉挺好,为啥被拒了? 问:技术面试的时候,题目挺简单的,我觉得自己都做出来了.可最后怎么还是被拒了啊? 答:面试被拒有很多种可能,比如面试官认为你性格不适合.态度不够诚恳等等 ...

  8. 2017远景能源Java面试

    前言 正值毕业季,四处找工作,今日面完,总体谈谈感觉吧! 正文 最近几年,远景在南京各高校搞的风波还是挺大的,东大开宣讲,其他学校包车来接,不是毕业生可能不熟悉,作者自己也是一无所知,就连我那个舍友最 ...

  9. 疫情之下裸辞后的一些感悟和面试心得

    疫情之下裸辞后的一些感悟和面试心得 因为个人原因,选择在疫情之下从上一家公司裸辞. 从5月25日递交辞呈,到现在基本确定下来.2个月左右的时间,经历了一些挫折,也收获了些许成长. 把我这段期间踩过的坑 ...

最新文章

  1. .Net有关问题。在GridView中添加了一个HyperLinkField,用来显示显示详细信息,请教跳转后的详细信息页面该怎样写代码
  2. mysql 存储过程 显示控制_mysql存储过程之控制语句篇
  3. python中的正则表达式re模块_python中的正则表达式(re模块)
  4. 深度学习笔记 第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换...
  5. [工具]微软的学习平台Microsoft Learn很好用,推荐一下
  6. [css] css中class和id选择器有什么区别?
  7. C语言探秘:C代码在内存中的分布
  8. TrustBase团队完成subscript语言的Web3基金会Grant资助计划项目交付
  9. TPLINK-WR720N刷openwrt
  10. Html5 Canvas动画基础碰撞检测的实现
  11. 粒子群优化算法matlab实现,粒子群优化算法的MATLAB程序实现+源程序
  12. 定时任务之cron表达式
  13. 最新10款好看的英文字体下载
  14. c语言餐桌游戏,教会你这十款酒桌游戏,让你在朋友圈稳站“C”位!
  15. MacOS与Windows快捷键对照
  16. excel转置怎么操作_Excel拆分文本,想怎么拆就怎么拆,简单易学,一看就会
  17. Android 拍摄(横 \ 竖屏)视频的懒人之路
  18. macOS Big Sur 11.2.3 (20D91) 正式版发布,百度网盘下载
  19. Phun-有趣的二维物理引擎
  20. win10系统怎么连接蓝牙耳机 旧时光 oldtimeblog

热门文章

  1. 执行python除法的符号_python 除法
  2. c语言中的/和%表示什么意思
  3. 北京历正科技 招聘FPGA工程师
  4. 电商网站秒杀系统如何设计
  5. 计算机控制面板包含的管理类别有什么,如何设置控制面板分类
  6. 男人就撑100秒flash游戏制作教程
  7. 制作Linux内存镜像+制作对应的volatility profile
  8. MiKTeX + Texmaker ← 推荐的 LaTeX 学习环境
  9. 《金蝶ERP-K/3完全使用详解》—— 导读
  10. baiduRanking多站点批量百度排名查询