#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 4557

    http://acm.hdu.edu.cn/showproblem.php?pid=4557 解决一类问题的set用法 #include <iostream> #include <c ...

  2. QList 列表指针的 释放

    1,使用qDeleteAll() QList<T*> list: qDeleteAll(list): list = NULL; QList<T*> *listp: qDelet ...

  3. linux下sprintf_s函数的替代

    error code: ]; sprintf_s(buf, , "predicted position:(%3d, %3d)", predict_pt.x, predict_pt. ...

  4. linux搜索命令之find和grep

    在使用linux时,经常需要进行文件查找,其中查找的命令主要有find和grep.两个命令是有区的. 区别:(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访 ...

  5. solr学习一(一大堆的学习资料)

    这篇博客含有海量资料,学习solr必备字典 大概看完solr就基本上手了. solr原味资料:http://wiki.apache.org/solr/FrontPage (     http://wi ...

  6. SQL Server 中关于EXCEPT和INTERSECT的用法

    熟练使用SQL Server中的各种用法会给查询带来很多方便.今天就介绍一下EXCEPT和INTERSECT.注意此语法仅在SQL Server 2005及以上版本支持. EXCEPT是指在第一个集合 ...

  7. 为什么有时候 php 没有写闭合标签结束符?

    找了一些资料,大家对PHP闭合标签的总结如下: 好处:如果这个是一个被别人包含的程序,没有这个结束符,可以减少很多很多问题,比如说:header, setcookie, session_start这些 ...

  8. FastAdmin 自己做的插件 SQL 有一个表没有生成成功

    群里有群友问: 给插件建的install.sql 里有三个表,为啥会出现安装成功后没有错误提示,只生成了两个表的情况..这可能会是什么...原因 第一感觉和 FastAdmin 没有关系. 没生成表, ...

  9. Microsoft Dynamics CRM 2011 配置好的IFD环境 怎么制作证书?

    一.CRM2011 IFD怎么制作证书? 配置好的IFD环境里面:打开开始—运行 1.输入: mmc(微软管理控制台) 出现: 2. 出现: 3.添加/删除管理单元,如图: 4.添加证书 5. 6. ...

  10. DKH大数据分析平台解决方案优势说明

    大数据技术的发展与应用已经在深刻地改变和影响我们的日常生活与工作,可以预见的是在大数据提升为国家战略层面后,未来的几年里大数据技术将会被更多的行业应用. 相信很多人对于大数据技术的应用还是处于一个非常 ...