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

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/  )

最新文章

  1. Building Websites in ASP.NET
  2. EFM32外设模块—USART V1.00
  3. C语言基本点初探
  4. mysql数据库连接方式(.net)
  5. 客户端访问AIDLService(远程绑定Service)
  6. 使用jQuery设置disabled属性与移除disabled属性
  7. Delphi中关于资源释放(Free,Relealse,FreeAndNil)
  8. 几种Menu和几种对话框
  9. Eclipse的SVN插件安装
  10. SQL Server 地理数据库中的系统表
  11. awk学习点滴
  12. Java 数据库编程 ResultSet 的 使用方法
  13. template package (godoc 翻译)
  14. 安卓7.1 新特性Shortcut
  15. 预置第三方apk到MTK项目相关问题总结
  16. 使用JavaMail创建邮件和发送邮件
  17. 【慕课网实战】四、以慕课网日志分析为例 进入大数据 Spark SQL 的世界
  18. 如何知道网页浏览器cookie是什么?
  19. 使用 py.test 对 python 代码进行测试
  20. Java——如何创建文件夹及文件,删除文件,文件夹

热门文章

  1. Java 中队列的使用
  2. oracle if then else
  3. ActionScript 3 中的强制类型转换
  4. Naive Bayes Algorithm
  5. (转)Windows7 64位系统搭建Cocos2d-x 2.2.1最新版以及Android交叉编译环境(详细教程) .
  6. #pragma_pack(n)_与___attribute(aligned(n))
  7. cocos2d-x 3.0 alpha1 生成Qt qch帮助文档
  8. 实验-hadoop开发环境部署
  9. C# 之 静态字段初始化
  10. 安卓Design包之Toolbar控件的使用