快速选择

【0】README

0.1)设有一组N 个数而要确定其中第k 个最小(大)者,我们称之为选择问题;
选择问题的解法?” 解法即为 快速选择算法;
0.2) 快速选择是对 快速排序 改造而来,快速选择的前三个步骤和 快速排序一致,最后一个步骤不同而已; 快速排序详情,参见 http://blog.csdn.net/pacosonswjtu/article/details/48879419

【1】算法描述

1.1)如果|S|=1,那么k=1, 将s中的元素作为答案返回。如果使用小数组的隔离值(cutoff)方法且|S| <= cutoff , 则将S排序并返回第k个最小元;
1.2) 选取一个枢纽元v属于S;
1.3) 将集合S-{v} 分割成 S1 和 S2,就像我们在快速排序中所作的那样;
1.4) 比较 k 与 |S1| 以及 |S1| + 1 的大小:

  • 1.4.1) 如果 k<=|S1|,那么第k个最小元素必然在S1中,在这种情况下,返回quickselect(S1,k);
  • 1.4.2) 如果 k=1+|S1|,那么枢纽元素就是第k个最小元素,即找到,直接返回;
  • 1.4.3) 否则,第k个最小元素就在S2中,即S2中的第(k-|S1|-1)个最小元素,我们递归调用并返回quickselect(S2,k-|S1|-1);

【2】选择的线性期望时间算法—— 快速选择

2.1) for complete code , please visit https://github.com/pacosonTang/dataStructure-algorithmAnalysis/blob/master/chapter7/p186.c

2.2)打印结果如下:
这里写图片描述

【3】代码演示分析步骤

这里写图片描述
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/pacoson/p/4893138.html