选择问题(选出第i个最小元素)
2024-09-14 19:58:21
通过分治法解决的分析(还有其他方法解决选择问题如使用 堆)
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/ )
最新文章
- Building Websites in ASP.NET
- EFM32外设模块—USART V1.00
- C语言基本点初探
- mysql数据库连接方式(.net)
- 客户端访问AIDLService(远程绑定Service)
- 使用jQuery设置disabled属性与移除disabled属性
- Delphi中关于资源释放(Free,Relealse,FreeAndNil)
- 几种Menu和几种对话框
- Eclipse的SVN插件安装
- SQL Server 地理数据库中的系统表
- awk学习点滴
- Java 数据库编程 ResultSet 的 使用方法
- template package (godoc 翻译)
- 安卓7.1 新特性Shortcut
- 预置第三方apk到MTK项目相关问题总结
- 使用JavaMail创建邮件和发送邮件
- 【慕课网实战】四、以慕课网日志分析为例 进入大数据 Spark SQL 的世界
- 如何知道网页浏览器cookie是什么?
- 使用 py.test 对 python 代码进行测试
- Java——如何创建文件夹及文件,删除文件,文件夹
热门文章
- Java 中队列的使用
- oracle if then else
- ActionScript 3 中的强制类型转换
- Naive Bayes Algorithm
- (转)Windows7 64位系统搭建Cocos2d-x 2.2.1最新版以及Android交叉编译环境(详细教程) .
- #pragma_pack(n)_与___attribute(aligned(n))
- cocos2d-x 3.0 alpha1 生成Qt qch帮助文档
- 实验-hadoop开发环境部署
- C# 之 静态字段初始化
- 安卓Design包之Toolbar控件的使用