选择问题(选出第i个最小元素)
通过分治法解决的分析(还有其他方法解决选择问题如使用 堆)
1 同快速排序一样,对输入的数组进行递归分解
不同的是:快速排序会递归处理分解的两边,而选择问题只处理需要的一边
2 选择问题的期望时间代价为Θ (n) (平均性能)
3 选择问题一般思路
a. 随机选取一个key
b. 进行区域划分,比key小的在左边,比key大的在右边
c. key的下标与 i (第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个最小元素)的更多相关文章
- 基于visual Studio2013解决面试题之0707最小元素
题目
- jQuery 选择同时包含两个class的元素的实现方法
Jquery选择器 多个 class属性参照以下案例 <element class="a b good list card"> 1. 交集选择: $(".a. ...
- 42.旋转数组的最小元素[Get min value of rotated array]
[题目] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5 ...
- 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
// test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 自定义栈类型,具有找到站内最小元素的min函数 ,且min(),pop(),push()函数的时间复杂度为O(1)
基本思想: // 借助一个辅助栈,入栈时,若新元素比辅助栈栈顶元素小,则直接放入辅助站 // 反之,辅助站中放入次小元素(即辅助栈栈顶元素)====保证最小元素出栈时,次小元素被保存 static c ...
- C++ *max_element函数找最大元素 *min_element函数找最小元素 STL算法(转)
http://blog.sina.com.cn/s/blog_6f3a860501019z1f.html #include<iostream> #include<algorithm& ...
- 实现栈最小元素的min函数
#include<iostream> #include<stack> using namespace std; class min_stack { public: void p ...
- python3 selenium 随机选择同一类型下的某一个元素
使用场景: 如上图所示,有时候,我们测试的时候,不会每个方向都选择一遍,也不能每次都选择一个方向,这个时候就需要每次运行用例的时候,随机选择一个方向来测试 使用方法: random.randint() ...
- 《剑指Offer》第20题(Java实现):定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
一.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 二.思路解析 首先定义一个Integer类型的栈,记为stack,此栈用来完成数据 ...
随机推荐
- 将word转化为swf 进行如同百度文库的般阅读
实现如同百度文库那样类似功能需要进行一系列转化,一般流程想将word转化为pdf格式,再将pdf格式转化为swf格式.在网页上显示其实都是swf格式内容. 首先将word转化为swf,需要调用com组 ...
- 百度地图经纬度转换JS版
//百度地图的坐标转换,由于百度地图在GCJ02协议的基础上又做了一次处理,变为 BD09协议的坐标,以下是坐标的转化方式,可以方便和其他平台转化 jQuery.MapConvert = { x_pi ...
- ios开发——常用经典算法OC篇&冒泡/快速
冒泡排序与快速排序 1.序言 ios开发中涉及到算法的地方还真不多,除非你的应用程序真的非常大,或者你想你的应用程序性能非常好才会去想到关于算法方面的性能优化,而在ios开发中真的能用得到的也就是关于 ...
- LINUX 运维命令
查看3306端口被什么程序占用 [root@DB13 ~]# lsof -i : COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME mysqld mysql ...
- LVS 之 DR 2
http://www.cnblogs.com/kgdxpr/archive/2013/09/09/3309776.html http://lyp0909.blog.51cto.com/508999/5 ...
- Maven 插件开发(一)
项目在重构之后,想由ant切换到maven,在转换的过程中遇到一个问题.因为项目是基于OSGi的架构,而OSGi在运行时是依赖于插件环境的,bundle之间存在package依赖.而maven是基于d ...
- svm、经验风险最小化、vc维
原文:http://blog.csdn.net/keith0812/article/details/8901113 “支持向量机方法是建立在统计学习理论的VC 维理论和结构风险最小原理基础上” 结构化 ...
- C#_模拟webAp_POST-GET-PUT-DELETE
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...
- css笔记08:id选择器之父子选择器
1.父子选择器 (1)01.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- openshift django目录结果
blog├── README.md├── requirements.txt├── setup.py├── static├── wsgi│ ├── application│ ├── db.sql ...