您的位置:首页 > 其它

快速排序的枢纽元选取策略

2015-03-01 11:22 351 查看
快速排序中枢纽元的选择会影响算法的效率

快速排序中的枢纽元指的是一个元素V,该元素将一个数集S分成两个互斥的集合s1和s2,s1中的任意元素均不大于V,s2中的任意元素均不小于V.

错误的选择策略

1)没有经过充分考虑,选择将数组的第一个元素作为枢纽元。

如果输入时随机的,那么这是可以接受的,但是如果输入时预排序的或是反序的,那么这样的枢纽元就产生了一个劣质的分割,即所有的元素不是全被划入s1就是全被划入s2。更有甚者,这种情况可能发生在所有的递归调用中。实际上,如果第一个元素用作枢纽元且输入时预排序的,那么快速排序话费的时间将是二次的,虽然是花费了这么多时间,但是却没有做什么事情,这比较尴尬。

2)选取输入中前两个互异关键字中的较大者作为枢纽元。

可选的枢纽元选取策略

1)随机选取枢纽元。这是一种比较安全的策略

见剑指offer

2)三数中值分割法。即随机选取三个元素,并用它们的中值作为枢纽元。一般的做法是使用左端,右端和中间的三个元素的中值作为枢纽元。使用三数中值分割法消除了预排序输入的坏情形

实际中的策略是:首选对A[left],A[rignt],A[center]进行从小到大排序,经过该操作后,三元素的最大者被放到了A[right],最小者被放到了A[left],A[center]中的元素大小居中,这样就可以作为枢纽元。由于A[right]大于枢纽元,我们可以把枢纽元放到A[right--1],并在分割阶段将左右的遍历索引i和j分别置为left+1,right-2.

这样操作的好处是,因为此时A[left]比枢纽元小,所以将它作为j的警戒标记,因此我们不用担心j越界;由于i将停在那些等于枢纽元处,故将枢纽元存储在A[right-1],将提供一个警戒标记。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: