求第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 ...
随机推荐
- SignalR 聊天室实例详解(服务器端推送版)
翻译自:http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room (在这里可以下载到实例的源码) Asp.Net Si ...
- Notepad++中如何设置自动换行以及行宽
view-->word wrap; setting->preference-->vertical edge settings; Notepad++中如何设置自动换行以及行宽 http ...
- WM_PAINT在微软官方定义中,wParam和lParam都没有使用,所以就被Delphi给重定义了这个消息,还增加了DC(Delphi可任意改写消息的结构)
LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); Parameters wParam ...
- Perl 面向对象编程的两种实现和比较:
<pre name="code" class="html">https://www.ibm.com/developerworks/cn/linux/ ...
- JSP:JAVA Bean在JSP中的运用
目录结构,如图: index.jsp <%@ page language="java" import="java.util.*" pageEncoding ...
- C++学习之路—继承与派生(一):基本概念与基类成员的访问属性
(本文根据<c++程序设计>(谭浩强)总结而成,整理者:华科小涛@http://www.cnblogs.com/hust-ghtao,转载请注明) 1 基本思想与概念 在传统的程序设计 ...
- 基于visual Studio2013解决面试题之0306打印第一次只出现一次的字符
题目
- 跟Google学习Android开发-起始篇-与其它应用程序交互(2)
6.2从活动获取结果 启动另一个活动不必是单向的.您也可以启动另一个活动,并接收一个结果回来.为了接收一个结果,调用startActivityForResult()(而不是startActivity( ...
- D3D 练习小框架
自己练习D3D 程序搭的小框架,记录在这里,将来看到好回顾自己独自摸索的苦逼样子. #pragma once #pragma comment(lib,"d3d9.lib") #pr ...
- hadoop出现ava.lang.ClassNotFoundException: org.codehaus.jackson.map.JsonMappingException
Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/map/JsonMa ...