快排的两种写法

1.在《数据结构》这本书中快排的基本思想是以第一个数为哨兵,然后先从数组尾部遍历,找到第一个比哨兵小的数,将哨兵和这个数交换,记为hi;再从数组第一个地方开始遍历,找到第一个比哨兵大的树,将哨兵和这个数交换,记为lo。如果lo>=hi,那么这次快排到此结束。

快排1


在这里,对相同的数字采取了原地等待的方式,这也就是能保证遍历找数字时候不会越界。这时候就会导致一个问题,如果nums[hi] == nums[lo] 而且nums[hi] == 哨兵,那么就会造成死循环,没有一个下标会移动。所以我们必须让其中一个移动,如果两个都移动,那么hi-lo==1时候,两个指针就会完美错过

最后无论返回hi或者lo都是可以的

2.在《算法》这本书中快排的基本思想是以第一个数为哨兵,然后先从数组尾部遍历,找到第一个比哨兵小的数,停止遍历,记为hi;再从数组第一个地方开始遍历,找到第一个比哨兵大的树,停止遍历,记为lo。如果lo>=hi,那么这次快排到此结束,返回hi,否则交换hi和lo这两个位置的数字。最后hi这个位置存放的仍然是比哨兵小的数,所以应该将哨兵和hi位置数字交换

快排2


在这里,对于和哨兵相等的数,我们采取继续遍历,这里会导致一个问题,数组越界,所以需要设置边界。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Given an unsorted integer array, find the first missing p...
    Jeanz阅读 1,482评论 0 0
  • 转载自:https://egoistk.github.io/2016/09/10/Java%E6%8E%92%E5...
    chad_it阅读 4,549评论 0 18
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,353评论 0 33
  • 快速排序,面试必问题。面试百度时三次面试被问到快排,本以为掌握的很好,但细节方面还是不到位,发挥的不是很好,特此记...
    王韩峰阅读 2,720评论 1 2
  • 最近在读< >时,了解到了很多常用的排序算法,故写一篇读书笔记记录下这些排序算法的思路和实现. 冒泡排序 冒泡排序...
    SylvanasSun阅读 3,998评论 0 0