您的位置:首页 > 其它

讲给对方听的算法--快速排序(快速选择)

2021-02-27 00:56 573 查看

有时候,想起来三四年前抱着红色的算法书籍,觉得这是自己的信仰,自己也觉得非常开心,编程都有了底气。但是也是看完就会忘记,啥也记不住。

如今想象,也是看过很多次,也听过很多人说过,如今也是忘了。挺无奈。

有一天早起,听了一下快速排序

基本思路:

在一个序列中,只有整数,8,2,5,7,4

第一步,选择一个基准,比如选择第一个,8(怎么选择也是可以优化,优化不影响算法思路)

第二步,空出8的位置,因为我们要给8找到序列中正确的顺序位置(因为选择第一位,可以从最后往前比较,不会重复)

第三步,将队列中的数字与8比较,小的放在左边,大的放在右边(操作形式是)
3.1-->假如从右边(从左边会重复混乱一点)开始,数组下标走到最后一位,4< 8,那么4填到空位,此时序列为(?)
答案:4257()
3.2-->数组下标走到倒数第二位,7< 8,不用动,已经在左边了。序列是?
答案是4257()

依次继续往后,就可以写出来。
依次序列是5< 8,, 4257()
2 < 8, 4257()
4 < 8, 4257()
到达第一位了,
说明8的序列位置找到了,就是最后一个。序列就是
42578

第三步,操作完成
第四步,继续选择第一位,4作为基准,重复第三步,序列依次是
判断是不是比较过的,8跳过,7>4,不动,序列是()2578
5>4不动,序列是()2578
2<4,交换,2()578,已经到最前,说明4的序列位置找到了,就是第二
24578

第五步,选择按顺序选择下一位基准数,2,循环之前的处理

这就是基本思路。

延伸出来的就是,快速选择
选择这个序列第K个数字(按照顺序,排第几的数)

情景:比如说上面的序列8,2,5,7,4,我想找到排第三位的数字,从小到大排。
答案大家都知道,应该算是5
思路:基准值排完之后,左边都是比他小的 ,即使无序也不重要,就知道它是第几位。
所以查找第k个数,就是找前面有k-1个数的位置上该有的基准数。

找到的过程如下:
第一步,依旧是按照快速排序,选择一个基准数(基准数的选择还是可以优化)
我们依旧选择8,借鉴之前:
说明8的序列位置找到了,就是最后一个。序列就是
42578
第二步,比较8的位数与目标位数。
比较目标,3<5,所以抛弃基准数的右边,从前面四位再快速排序。(找这个序列排第三位的(这里也好好理解一下下))
剩余的序列是4257
第三步,选择一个基准数,假如依旧从开头选,4,
经过比较,借鉴之前:
说明4的序列位置找到了,就是第二个。序列就是
2457
第四步,比较4的位数与目标位数
比较目标,3> 2,所以抛弃基准数的左边,从后面两位再快速排序。
(找这个序列排第(3-2=1)1位的)(这里好好理解一下)
第五步,57,依旧选择开头,5,从最后一位比较,7>5,不动,是最前一个数,
说明5的序列位置找到了,就是第1个。序列就是
57

此刻就快速选到了第三位的数字就是5,结束。

这样我们就描述完了快速排序算法的思想,也顺道延伸了一下快速选择。

有缘下次再见。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐