快速排序的枢纽元选取策略
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],将提供一个警戒标记。
快速排序中的枢纽元指的是一个元素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],将提供一个警戒标记。
相关文章推荐
- 高级排序-快速排序,最右边的值为枢纽
- 快速排序理解(挖坑填数策略)
- 快速排序基于不同枢纽的实现方法
- 递归与分治策略-2.8快速排序
- 快速排序、基准元的选取及其优化
- 分治策略----快速排序
- 二分法查找和快速排序 二分法是分治算法的一种特殊形式,利用分治策略求解时,所需时间取决于分解后子问题的个数、子问题的规模大小等因素,而二分法,由于其划分的简单和均匀的特点,是查找数据时经常采用的一种有
- 分治策略:快速排序
- 快速排序普通法与中值枢纽元法以及三切法
- Java语言描述:递归与分治策略之合并排序与快速排序
- 快速排序枢纽值(基元)选择方法(转载)
- 链表实现归并(快速、插入)排序
- 快速排序
- C语言快速排序与二分查找算法示例
- 快速排序
- 杭电ACM OJ 1029 Ignatius and the Princess IV 快速排序 挖坑填埋法
- 快速排序(JAVA)
- Java 快速排序 快排
- 数据结构(4)快速排序
- hdu1425 sort 快速排序