快排第n趟排序结果校验
2016-11-13 16:17
113 查看
快排第n趟排序结果校验
@(算法学习)(2014.11)下列选项中,不可能是快速排序第二趟排序结果的是:
A. 2,3,5,4,6,7,9
B. 2,7,5,6,4,3,9
C. 3,2,5,4,7,6,9
D. 4,2,3,5,7,6,9
分析:只需要掌握一点就可以解出这个问题:每趟排序就有一个元素排在了最终的位置上。那么就是说,第n趟结束,至少有n个元素已经排在了最终的位置上。
所以我们把最终排序结果写出来:
2,3,4,5,6,7,9去与每一项做比较即可快速判断。
比如A:
2,3,4,5,6,7,9
2,3,5,4,6,7,9
有五个都已经满足了,则肯定可以是2趟快排的结果。
B:
2,3,4,5,6,7,9
2,7,5,6,4,3,9
有两个,则满足。
C:
2,3,4,5,6,7,9
3,2,5,4,7,6,9
只有一个,不满足。
D:
2,3,4,5,6,7,9
4,2,3,5,7,6,9
有两个满足。
反之,找到两个就可以死反向构造符合条件的快排。比如我们以D为例,且以严版算法为准,每次Partion时用第一个为pivot。
4,2,3,5,7,6,9
假设第二趟定位了9,则可以是:
9,2,3,5,7,6,4
即以9为pivot,从右往左找比9小的,high指向4结束,将4存到9的位置。
4,2,3,5,7,6,4⎯⎯
在从左往右找比9大的,一直跑到low = high,都未找到,因此,结束循环。循环之外,把9放到划线的4的位置。
4,2,3,5,7,6,9.
再倒推到第一趟:
5,2,3,4,7,6,9.
描述过程:以5为pivot,从右往左找比5小的,找到4,交换到5的位置:4,2,3,4⎯⎯,7,6,9.
再从左往右找比5大的,注意当low = high时结束寻找强制结束,所以这里找不到,因为会在划线处low = high.
再把5放到划线处,本次Partion结束。
变为:
4,2,3,5,7,6,9.
举个例子只是想说,只要满足第n趟有至少n个已经排好位置的元素,则一定有对应的快速排序过程。逆向推导过程大多情况下是不必要的。
相关文章推荐
- 冒泡法排序及排序结果校验
- 问题:oracle 排序 null值放在最后;结果: ORACLE中null的排序问题
- 【JAVA编程题】现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
- 将MySQL查询结果按值排序的简要教程
- MySQL中对查询结果排序和限定结果的返回数量的用法教程
- 6 Lucene笔记(六):检索结果排序问题
- 搜索旋转排序数组 查看运行结果 ——LintCode
- oracle 查询结果的排序,ASC/DESC,升序,降序,多列排序,ORDER BY,一些练习题
- mysql查询结果按指定顺序排序
- 数据库查询结果的动态排序(5)
- php对特殊语句查询结果进行数组排序
- Mapreduce算法三、利用cleanup对reduce结果进行排序
- Lucene.net搜索结果排序(单条件和多条件)
- 浅析SQL查询语句未显式指定排序方式,无法保证同样的查询每次排序结果都一致的原因
- SQL SERVER中对查询结果随机排序
- mysql中左外连接结果的排序
- lucene利用sort对查询结果进行排序示例
- 解决模糊查询的结果记录排序问题
- Lucene3.0结果排序原理+操作+示例
- DEDECMS搜索结果按点击排序的方法