求第i个小的元素 时间复杂度O(n)
#include<iostream> //求第i个小的元素 时间复杂度O(n)
#include<cstdlib>
#include<ctime>
using namespace std; void swap(double *dPara1, double *dPara2)
{
double temp = 0.0;
temp = *dPara1;
*dPara1 = *dPara2;
*dPara2 = temp;
} int randompartitionA( double dArr[], int p, int q) //划分
{
srand((unsigned)time(NULL));
int account = q-p+1;
int index = 0;
int i = p;
index = rand()%account+p;
swap(dArr[p], dArr[index]);
int x = dArr[p];
for( int j=p+1; j<=q; j++)
{
if( dArr[j]<=x )
{
i++;
swap(dArr[i], dArr[j]);
}
}
swap(dArr[i], dArr[p]);
return i;
} int randompartitionB( double dArr[], int p, int q) //划分
{
srand((unsigned)time(NULL));
int account = q-p+1;
int index = 0; index = rand()%account+p;
swap(dArr[p], dArr[index]);
double x = dArr[p]; int low = p;
int high = q; while( low<high )
{
while(low<high&&x<dArr[high]) --high;
dArr[low]=dArr[high];
while(low<high&&x>dArr[low]) ++low;
dArr[high]=dArr[low];
}
dArr[low] = x;
return low;
} double RANDOMIZED_SELECT( double dArr[], int p, int q, int i)
{
if( p==q )
{
return dArr[p];
}
int r = randompartitionB( dArr, p, q); // int r = randompartition( dArr, p, q);
int k = r-p+1;
if( i==k )
{
return dArr[r];
}
else if( i<k )
{
return RANDOMIZED_SELECT( dArr, p, r-1, i);
}
else
{
return RANDOMIZED_SELECT( dArr, r+1, q, i-k);
}
}
int main()
{
double darr[9] = { 1.0, 2.0 ,6.3, 3.5, 8.3, 0.43, 9, 10, 2.2 };
cout<<RANDOMIZED_SELECT( darr, 0, 8, 5);
cout<<endl;
return 0; }
求第i个小的元素 时间复杂度O(n)的更多相关文章
- 【算法导论】第i小的元素
第i小的元素 时间复杂度:O(n). 基本思想:和快速排序的思想相似,也是对数组进行递归划分,但是有所差别的是,快速排序会递归处理划分的两边,而随机化的选择算法只选择一边. 具 ...
- 利用快排partition求前N小的元素
求前k小的数,一般人的想法就是先排序,然后再遍历,但是题目只是求前N小,没有必要完全排序,所以可以想到部分排序,而能够部分排序的排序算法我能想到的就是堆排序和快排了. 第一种思路,局部堆排序. 首先, ...
- 算法导论-顺序统计-快速求第i小的元素
目录 1.问题的引出-求第i个顺序统计量 2.方法一:以期望线性时间做选择 3.方法二(改进):最坏情况线性时间的选择 4.完整测试代码(c++) 5.参考资料 内容 1.问题的引出-求第i个顺序统计 ...
- 树状数组求第k小的元素
int find_kth(int k) { int ans = 0,cnt = 0; for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般 ...
- ch1_5_2求无序序列中第k小的元素
import java.util.Arrays; import java.util.PriorityQueue; public class ch1_5_2求无序序列中第k小的元素 { public s ...
- 求第k小的元素
用快排解决: 用快排,一趟排序后,根据基准值来缩小问题规模.基准值的下角标i 加1 表示了基准值在数组中第几小.如果k<i+1,那就在左半边找:如果k>i+1那就在右半边找.当基准值的下角 ...
- Java练习小题_求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
要求说明: 题目:求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将 a[i][i] 累加后输出. 实现思路: [二维数组]相关知识 ...
- [LeetCode] Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素
Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...
- [LeetCode] 378. Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素
Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...
随机推荐
- [置顶] Android中使用sqlite3操作SQLite
SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 一.创建数据库: 1.将sqlit ...
- 130831组队赛-Regionals 2011, Asia - Kuala Lumpur
A.Smooth Visualization 简单模拟题,不多说了. #include<iostream> #include<cstdio> #include<algor ...
- C++-struct类的新特性当class用
#include <iostream> #include <iomanip> #include <string> using namespace std; stru ...
- 【linux】linux内核移植错误记录
欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http ...
- COM实现过程
前言 COM已经成为一个必需的东西了.在我们周围,可以说处处充满了COM – 如果你是在使用WINDOWS,并在其下面编写程序的话.然而,无论你是用VC,还是使用DELPHI进行COM编程时,在大多数 ...
- Android - 设置adb的usb连接配置
设置adb的usb连接配置 本文地址: http://blog.csdn.net/caroline_wendy 把须要測试的手机连接入电脑.通过系统查找USB连接配置,找到厂商ID: 把ID加入进ad ...
- Swift - 使用TableView的静态单元格进行页面布局
通过使用静态单元格的列表,我们可以很方便的进行页面布局.下面通过一个“添加任务页面”来进行演示. 效果图如下: 实现步骤: 1,在storyboard中拖入一个TableViewController, ...
- JS - 侧边导航收缩伸展
下载地址:http://www.lanrentuku.com/js/daohang-1162.html
- adb 命令使用的时候出现Error
在使用adb 命令行的时候会出现Error 重启adb server 即可,使用管理员运行Cmd 命令窗口 adb kill-server adb start-server 如果是连接真机查看的时候再 ...
- Eclipse使用总结
Eclipse使用总结 1.Eclipse中出现无法找到Maven包 症状:出现org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER, 且出现无法找 ...