#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string>
#include <string.h>
using namespace std; const int nMax = ;
int A[nMax+];
int B[nMax+];//用来每次5分法后保存要比较的值在A中的下标
int AIndex[nMax+]; //用来保存A的初始化下标 //通过插入排序获取中位数下标
int InsertSort(int A[], int B[], int start, int end)
{
if (start == end)
{
return B[start];
} for (int i = start+; i <= end; ++i)
{
int num = A[B[i]];
int j = i-;
for ( ; j >= start; --j)
{
if (num < A[B[j]])
{
A[B[j + ]] = A[B[j]];
}
else
{
break;
}
}
A[B[j + ]] = num;
} return B[(start + end)/];
} //获取中位数的中位数的下标
int GetMidMid(int A[], int AIndex[], int k, int n)
{
if (k == n)
{
return AIndex[n];
} int len_s = n - k + ;
//筛选出n/5份的中位数
int mod = len_s % ;
int len = len_s / + (mod != );
for (int i = , j = k; i<= len && j <= n-mod; ++i, j+=)
{
B[i] = InsertSort(A, AIndex,j, j+);
}
if (mod != )
{
B[len] = InsertSort(A, AIndex, n - mod + , n);
}
return GetMidMid(A, B, , len);
} //原址排序
int Partition(int A[], int p, int n)
{
int pivot = A[n];
int j = p - ;
for (int i = p; i <= n - ; ++i)
{
if (A[i] <= pivot)
{
j++;
swap(A[j], A[i]);
}
} swap(A[j + ], A[n]);
return j + ;
} int Select(int A[], int k, int n, int i)
{
if (k == n)
{
return A[n];
} int midValueIndex = GetMidMid(A, AIndex, k, n); //将该中位数作为主元(pivot element)
//使用一次原址重排
int pivot = A[midValueIndex];
swap(A[midValueIndex], A[n]);
int mid = Partition(A, k, n); int t = mid - k + ;
if (i == t)
{
return A[mid];
}
else if (i < t)
{
return Select(A, k, mid-, i);
}
else
{
return Select(A, mid+, n, i-t);
}
}
int main(int argc, char** argv)
{
int n = ;
for (int i = ; i <= n; ++i)
{
A[i] = i;
AIndex[i] = i;
} //for (int i = 1; i <= n; ++i)
//{
// cout << A[i] << " ";
//}
//cout << endl; int equalNum = ;
for (int i = ; i <= n; ++i)
{
//随机排列A数组
for (int i = ; i <= n; ++i)
{
int j = i + rand() % nMax;
//swap(A[i], A[j]);
A[i] = j;
} int ans1 = Select(A, , n, i);
sort(A + , A + n + );
int ans2 = A[i]; if (ans1 == ans2)
{
equalNum++;
}
}
cout << n << " " << equalNum << endl;
return ;
}

Select算法(最坏复杂度O(n))的更多相关文章

  1. 重拾算法之复杂度分析(大O表示法)

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  2. 数据结构与算法 java描述 第一章 算法及其复杂度

    目录 数据结构与算法 java描述 笔记 第一章 算法及其复杂度 算法的定义 算法性能的分析与评价 问题规模.运行时间及时间复杂度 渐进复杂度 大 O 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...

  3. 【Unsolved】线性时间选择算法的复杂度证明

    线性时间选择算法中,最坏情况仍然可以保持O(n). 原因是通过对中位数的中位数的寻找,保证每次分组后,任意一组包含元素的数量不会大于某个值. 普通的Partition最坏情况下,每次只能排除一个元素, ...

  4. 浅谈压缩感知(二十七):压缩感知重构算法之稀疏度自适应匹配追踪(SAMP)

    主要内容: SAMP的算法流程 SAMP的MATLAB实现 一维信号的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.SAMP的算法流程 前面所述大部分OMP及其前改算法都需要已知信号的稀疏度 ...

  5. 算法最坏,平均和最佳情况(Worst, Average and Best Cases)-------geeksforgeeks 翻译

    最坏,平均和最佳运行时间(Worst, Average and Best Cases) 在上一篇文章中,我们讨论到了渐进分析可以解决分析算法的问题,那么在这一篇中,我们用线性搜索来举例说明一下如何用渐 ...

  6. C++:主要几种排序算法及其复杂度

     常见排序算法稳定性和复杂度分析快速简记以及转载 分类: 算法 2012-02-07 22:18 399人阅读 评论(1) 收藏 举报 算法mergeshell http://blogold.chin ...

  7. 给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。

    有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M. 需要选出若干个x,使这几个x的和与 M 最接近. 请描述实现算法,并指出算法复杂度. #define M 8 ...

  8. C++ STL标准容器插入删除算法的复杂度

    1 vector内部实现: 数组 // 就是没有固定大小的数组,vector直接翻译是向量的意思支持操作:begin(), //取首个元素,返回一个iteratorend(), //取末尾(最后一个元 ...

  9. Fast Newman-FN算法以及模块度定义介绍

    一.社区的定义 Newman第一次提出模块度定义就是在2004年发表的这篇文章“fast algorithm for community structure in networks”,第一次用量化的公 ...

随机推荐

  1. HDU 1590 Searching(求复数向量和的极限)

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  2. SSH 获取GET/POST参数

    在做项目的API通知接口的时候,发现在SSH框架中无法获取到对方服务器发来的异步通知信息.最后排查到的原因可能是struts2对HttpServletRequest进行了二次处理,那么该如何拿到pos ...

  3. CentOS7安装OpenStack(Rocky版)-07.安装horizon服务组件(控制节点dashboard)

    在上一篇文章分享了neutron网络服务的安装配置,本文分享openstack的horizon(dashboard)web界面管理服务,方便在浏览器操作 ---------------------- ...

  4. 安装python第三方库

    前言 接触python编程很晚,基础语法比较好理解,但是用起来还是需要用心的,特别是可能会用到许多第三方库,本文就介绍一下python第三方库的安装. 环境 系统环境:win7_64; Python版 ...

  5. EasyTouch中多种QuickGesture手势检测

    EasyTouch中QuickGesture的用法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Qu ...

  6. Windows10中启用原来的Windows照片查看器方法

    前言: ============================================== Windows10 版系统自带很多垃圾应用,图片查看器弄得很不好用,还是习惯Windows7的,自 ...

  7. BT601. BT709色彩空间

    参考:http://blog.csdn.net/mao0514/article/details/16958873

  8. stenciljs 学习三 组件生命周期

    stenciljs 组件包含好多生命周期方法, will did load update unload 实现生命周期的方法比价简单类似 componentWillLoad ....,使用typescr ...

  9. TensorFlow笔记-08-过拟合,正则化,matplotlib 区分红蓝点

    TensorFlow笔记-08-过拟合,正则化,matplotlib 区分红蓝点 首先提醒一下,第7讲的最后滑动平均的代码已经更新了,代码要比理论重要 今天是过拟合,和正则化,本篇后面可能或更有兴趣, ...

  10. ubuntu16安装及嵌入式开发环境搭建

    1.Ubuntu虚拟机新建好要安装vmware tools才能共享文件夹,解压安装tar zxf VMwareTools-10.0.10-4301679.tar.gz ,回车键,解压该文件. 解压完毕 ...