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

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. Parallax Mapping Shader 凸凹感【转】

    原文 http://www.azure.com.cn/default.asp?cat=11&page=2 Parallax Mapping 就是通过高度图中的高度,对纹理坐标进行偏移,来视觉上 ...

  2. 经常使用的android弹出对话框

    我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其它平台开发经验的朋友都会知道,大部分的平台都仅仅提供了几个最简单的实现,假设我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承 ...

  3. socket通信简单介绍

    “一切皆Socket!” 话虽些许夸张,可是事实也是,如今的网络编程差点儿都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间怎样通信,如我们每天打开浏 ...

  4. hive 经常使用命令

    1.查看表结构信息   desc formatted table_name;   desc table_name; 查看关联文件: desc extended f_tblog_online_mds; ...

  5. ireport启动闪退问题

    安装好ireport之后,双击ireport.exe启动程序只是掠过启动画面便毫无反应, 后来在网上找了下解决方法,才知道只因为ireport与jdk8不兼容, 于是下载了jdk6,并在ireport ...

  6. 《Maven_孔浩》依赖传递

    间接依赖的包中有同级相同的依赖,那么按照写在前面的依赖:如果不同级有相同的依赖,那么按照级别最高的为准. 依赖的范围scope(test/compile/provided/runtime) test: ...

  7. 高级进程间通信之基于STREAMS的管道

    基于STREAMS的管道(简称STREAMS管道,STREAMS pipe)是一个双向(全双工)管道.单个STREAMS管道就能向父.子进程提供双向的数据流. 将http://www.cnblogs. ...

  8. bash的for循环从命令读取值

    bash的for循环可以很方便地从命令读取值,还可以指定分割值 下面的程序可以打印文件的内容,前面加上行号 #!/bin/bash # 打印每一行的内容,前面加行号 filename="/h ...

  9. java面试笔试谈

    例一: public class Inc { public static void main(String[] args) { Inc inc=new Inc(); int i=5; inc.ferm ...

  10. org.apache.hadoop.fs-Seekable

    本来要先看BufferedFSInputStream的,但是它实现了Seekable和PositionedReadable接口,就先看这两个,再看它会比较容易理解些 package org.apach ...