#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. 计算 S=a+aa+aaa+aaaa+a.......a【转载】

    package java算法; import java.util.Scanner; /* * 计算 S=a+aa+aaa+aaaa+a.......a */ public class numadd { ...

  2. 常用增强学习实验环境 II (ViZDoom, Roboschool, TensorFlow Agents, ELF, Coach等) (转载)

    原文链接:http://blog.csdn.net/jinzhuojun/article/details/78508203 前段时间Nature上发表的升级版Alpha Go - AlphaGo Ze ...

  3. hacking a friend's Linux buzzer driver in OK335xS

    /**************************************************************************** * hacking a friend's L ...

  4. CF1083(div1)

    A. The Fair Nut and the Best Path 题意:给定有点权,有边权的树,让你选择一条链(也可以是只有一个点),使得点权之和-边权最大. 思路:裸的树形DP,我们用dp[i]表 ...

  5. HDU 3746:Cyclic Nacklace(KMP循环节)

    Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. PAT天梯:L1-019. 谁先倒

    L1-019. 谁先倒 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳 ...

  7. (dfs痕迹清理兄弟篇)bfs作用效果的后效性

    dfs通过递归将每种情景分割在不同的时空,但需要对每种情况对后续时空造成的痕迹进行清理(这是对全局变量而言的,对形式变量不需要清理(因为已经被分割在不同时空)) bfs由于不是利用递归则不能分割不同的 ...

  8. setsebool命令详解与SELinux管理

    setsebool命令是用来修改SElinux策略内各项规则的布尔值.setsebool命令和getsebool命令是SELinux修改和查询布尔值的一套工具组.SELinux的策略与规则管理相关命令 ...

  9. ASP.NET MVC Area 的使用

    MVC提供Area机制,在同一个项目之内就能够切割出不同的ASP.NET MVC网站. 插入:首先在相同的位置,比如说同一个文件夹(如:Controllers)是不能创建俩个相同名称的文件(如:Hom ...

  10. 浏览器的自动翻译会影响 JS 逻辑

    有人在 QQ 群里反馈,官方注册后跳转时出现 Bug. 收到群友非常有用的资讯,这是因为浏览器的自动翻译功能引起的. 11:04:21[潜水]Better Command 2017/12/30 11: ...