通过分治法解决的分析(还有其他方法解决选择问题如使用

1 同快速排序一样,对输入的数组进行递归分解

不同的是:快速排序会递归处理分解的两边,而选择问题只处理需要的一边

2 选择问题的期望时间代价为Θ (n)  (平均性能)

3 选择问题一般思路

a. 随机选取一个key

b. 进行区域划分,比key小的在左边,比key大的在右边

c. key的下标与 (第i个最小元素的下标)比较,分别处理3种情况

   相等:    即为需要选择的元素 

i<key:      说明第i个最小元素在划分区域的左边,进行递归分解左边的区域   

i>key:      说明第i个最小元素在划分区域的右边,进行递归分解右边的区域,[注意需要考虑

        此时第i个元素在区域右边为第i-k(key的下标)个最小元素]

 #include <iostream>
using namespace std; //交换数据
void Swap(int array[], int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
} //选择问题,index 表示选择第i个最小元素
int RandomSelect(int array[], int size, int index)
{
if (size <=)
{
return array[size-]; //只有一个元素时即为需要选择的元素
} int key = ;
Swap(array, , rand()%size); //随机化取样,获得关键值key并与array[0]交换 //进行区域划分,分别与key比较,小于key的都在左边,大于key的都在右边
for (int i=; i<size; ++i)
{
if (array[i] < array[])
{
Swap(array, ++key, i);
}
}
Swap(array, , key);//关键值key回到正确的位置 if (key == index-) //相等,即为需要选择的第i个元素
{
return array[key];
}
else if (index- < key) //index小于key,即第i个元素在划分区域的左边
{
return RandomSelect(array, key, index);
}
else//index大于key,即第i个元素在划分区域的左边,注意同时更新index-key-1(去除key本身)
{
return RandomSelect(array+key+, size-key-, index-key-);
}
} void main()
{ int Array[] = {, , , , , , , , , }; int i = ;
cout << "第" << i <<"个最小元素: "
<< RandomSelect(Array, , i) << endl; system("pause");
}

(转载请注明作者和出处^_*  Seven++ http://www.cnblogs.com/sevenPP/  )

选择问题(选出第i个最小元素)的更多相关文章

  1. 基于visual Studio2013解决面试题之0707最小元素

     题目

  2. jQuery 选择同时包含两个class的元素的实现方法

    Jquery选择器 多个 class属性参照以下案例 <element class="a b good list card"> 1. 交集选择: $(".a. ...

  3. 42.旋转数组的最小元素[Get min value of rotated array]

    [题目] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5 ...

  4. 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  5. 自定义栈类型,具有找到站内最小元素的min函数 ,且min(),pop(),push()函数的时间复杂度为O(1)

    基本思想: // 借助一个辅助栈,入栈时,若新元素比辅助栈栈顶元素小,则直接放入辅助站 // 反之,辅助站中放入次小元素(即辅助栈栈顶元素)====保证最小元素出栈时,次小元素被保存 static c ...

  6. C++ *max_element函数找最大元素 *min_element函数找最小元素 STL算法(转)

    http://blog.sina.com.cn/s/blog_6f3a860501019z1f.html #include<iostream> #include<algorithm& ...

  7. 实现栈最小元素的min函数

    #include<iostream> #include<stack> using namespace std; class min_stack { public: void p ...

  8. python3 selenium 随机选择同一类型下的某一个元素

    使用场景: 如上图所示,有时候,我们测试的时候,不会每个方向都选择一遍,也不能每次都选择一个方向,这个时候就需要每次运行用例的时候,随机选择一个方向来测试 使用方法: random.randint() ...

  9. 《剑指Offer》第20题(Java实现):定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

    一.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 二.思路解析 首先定义一个Integer类型的栈,记为stack,此栈用来完成数据 ...

随机推荐

  1. HTML5 服务器推送事件(Server-sent Events)实战开发

    转自:http://www.ibm.com/developerworks/cn/web/1307_chengfu_serversentevent/ http://www.ibm.com/develop ...

  2. poj 1338 Ugly Numbers(丑数模拟)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=1338&q ...

  3. Java 中队列的使用

    刚才看见群里的一个朋友在问队列的使用,确实在现实的写代码中非常少使用队列的,反正我是从来没使用过.仅仅是学数据结构的时候学过. 以下是我写的一个小样例,希望有不足之处请提出改正.O(∩_∩)O~ 看代 ...

  4. Android应用程序框架之无边界设计意图

    Android的应用框架的外特性空间的描述在SDK文档有十分清楚的描述,Android应用的基本概念,组件生命周期等等有详细的描述.在外特性空间中,Android提供了Activity,Service ...

  5. 安装 Nginx 并配置负载均衡

    1,在节点 192.168.1.40 上执行安装 nginx,操作如下: 01 02 03 sudo apt-add-repository ppa:nginx/development sudo apt ...

  6. linux对外开放某个端口命令

    /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT /etc/rc.d/init.d/iptables save /etc/rc.d/init.d/ ...

  7. percona-toolkit工具包的使用教程

    http://blog.chinaunix.net/uid-20639775-id-3236916.html     本文收集了percona-toolkit工具包中比较常用的工具集,写成教程,方便自 ...

  8. Exploring Python Code Objects

    Exploring Python Code Objects https://late.am/post/2012/03/26/exploring-python-code-objects.html Ins ...

  9. UNIX标准化及实现之POSIX标准可选头文件

    POSIX标准定义的可选头文件 头文件 说明 <aio.h> 异步I/O <mqueue.h> 消息队列 <pthread.h> 线程 <sched.h> ...

  10. Type mytableview does not confirm to portocol UITableViewDataResource

    继承UITableViewDataSource报上面这个总是,是重写协议时写错了 override func numberOfRowsInSection(section: Int) -> Int ...