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

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. [AngularJS] ui-router: named views

    The ui-router library for AngularJS provides the ability to name views within your application. This ...

  2. hdu 3006 枚举集合能够产生的全部并集的集合

    http://acm.hdu.edu.cn/showproblem.php? pid=3006 刚买的CHERRY键盘 手感真好 可惜不习惯 写代码老是打错.一个题写了一上午,都是各种按错键DEBUG ...

  3. Scrapy 对不同的Item进行分开存储

    在Piperlines里面进行对象的判断, def process_item(self, item, spider): if item.__class__ == BaseItem : #savexxx ...

  4. Oracle数据库的导入与导出

    导出 在命令行输入"exp",回车即可访问指定的数据库, 我这里需要访问远程的数据库,所以带上了IP.端口等一些参数,具体的参数详情可以输入"exp -help" ...

  5. java_java 利用JAX-RS快速开发RESTful 服务

    JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/jsr/detail?id=311 .从 ...

  6. 数据库SQLite应用

    1.导入SQLite库和头文件 #import <sqlite3.h> 2.打开数据库,如果在打开的时候遇到了问题,则关闭它并抛出一个断言错误. sqlite3 * database; i ...

  7. github使用成长记

    学校里一直都有自己写一些网页,一方面为了学习熟练技能,另一方面也是兴趣所在.但是独乐乐不如众乐乐,一直向往有那么一个平台能把自己做得东西分享给广大网友,并且想借着分享的契机和各位程序猿交流学习心得(这 ...

  8. Android SQLite 数据库详细介绍

    Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...

  9. GIT免密码PUSH

    摘自:dudu 备忘,感谢! 1. 在Windows中添加一个HOME环境变量,值为%USERPROFILE%,如下图: 2. 在“开始>运行”中打开%Home%,新建一个名为“_netrc”的 ...

  10. MSP430常见问题之IO端口类

    Q1:请问430 的I/O 中断能不能可靠的响应60ns 的脉冲信号, 就是来了一个60ns 的脉冲,430 的中断会有丢失吗?A1:端口支持的最高8M的时钟,无法响应这么快的频率. Q2:430是3 ...