您的位置:首页 > 其它

快排第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个已经排好位置的元素,则一定有对应的快速排序过程。逆向推导过程大多情况下是不必要的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息