快速选择
2015-10-05 16:54
225 查看
【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.c2.2)打印结果如下:
【3】代码演示分析步骤
相关文章推荐
- Android UI SurfaceView的使用-绘制组合图型,并使其移动
- (数据挖掘-入门-6)十折交叉验证和K近邻
- 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
- 【第4周 项目5 - 猴子选大王】
- 常用的代码收集,没有任何技术含量,只是填坑的积累
- boost:asio学习心得
- 软件测试知识点
- 阅读《时间,管理把握最宝贵的财富》摘录(1)
- java基础---类中的名称
- Swift和OC代码注释分析 #pragma mark, FIXME and TODO
- 第四周 线性表(二)--链表 项目一 -- 建立单链表
- Dubbo项目实战 (一)服务划分粒度
- 第六周 周一 栈链
- Oracle存储过程实例
- 阴阳
- Dubbo项目实战 (一)服务划分粒度
- java编程思想-持有对象
- 第四周,项目2-建设“单链表”算法库。
- 详细阐述约瑟夫环问题(报数出队问题)
- maints使用