分治与递归-找k个临近中位数的数
问题描述:给定由n个互不相同的数组成的集合S以及正整数k≤n,试设计一个O(n)时间算法找出S中最接近S的中位数的k个数。
算法描述:
- 用线性时间选择实现的算法找到中位数
- S’=除去中位数外的S
- S"=|S'中的数值-中位数的值|
- 用线性时间选择实现的算法找到第k个最小的数
- 输出S”中小于第k个最小的数的数对应的S中的值
算法实现:
selectorder函数、partition函数、sord函数同线性时间选择程序的算法实现,故略。
int main()
{
void sord(int a[],int h,int t);
int selectorder(int x,int a[],int h,int t);
int partition(int a[],int h,int t,int k);
int n;
scanf("%d",&n);
int *a;
a=(int *)malloc(sizeof(int)*n);
for(int i=;i<n;i++)
a[i]=rand();
for(int i=;i<n;i++)
printf("%d ",a[i]);
//动态分配数组a
//随机生成数组a元素、输出
/*
int n=7;
int a[7]={0,-1,20,-4,-100,2000,2001};
for(int i=0;i<n;i++)
printf("%d ",a[i]);
*/
printf("\n");
int middle;
middle=selectorder((n-)/,a,,n-);
printf("%d\n",middle);
//找到数组a中的中位数并赋值给middle
int *b;
b=(int *)malloc(sizeof(int)*n);
for(int i=;i<n;i++)
if(a[i]>=middle)b[i]=a[i]-middle;
else b[i]=middle-a[i];
//动态分配数组b
//数组b中元素=|数组a中元素-middle|
int *c;
c=(int *)malloc(sizeof(int)*n);
for(int i=;i<n;i++)c[i]=b[i];
//数组c中元素=数组b中元素
int k;
scanf("%d",&k);
//输入k
int last;
last=selectorder(k-,b,,n-);
//找到数组b中第k小元素并赋值给last
for(int i=;i<n;i++)
if(c[i]<=last)printf("%d ",a[i]);
//遍历数组c,如果数组c中元素小于last,
//则输出对应位置上数组a的元素
printf("\n");
sord(a,,n-);
for(int i=;i<n;i++)printf("%d ",a[i]);
return ;
}
分治与递归-找k个临近中位数的数的更多相关文章
- 数据结构和算法(Golang实现)(8.2)基础知识-分治法和递归
分治法和递归 在计算机科学中,分治法是一种很重要的算法. 字面上的解释是分而治之,就是把一个复杂的问题分成两个或更多的相同或相似的子问题. 直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合 ...
- Java使用递归找出某目录下的所有子目录以及子文件
/* 使用递归找出某目录("C:\\JavaProducts")下的所有子目录以及子文件 */ import java.util.*; import java.io.*; publ ...
- [LeetCode] 295. Find Median from Data Stream 找出数据流的中位数
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
- 从长度为 M 的无序数组中,找出N个最小的数
从长度为 M 的无序数组中,找出 N个最小的数 在一组长度为 n 的无序的数组中,取最小的 m个数(m < n), 要求时间复杂度 O(m * n) 网易有道面试题 const minTopK ...
- FZU みねちゃんの修罗场(从一堆出现三次的数中找出出现两次的数)
みねちゃんの修罗场 Time Limit: 5000 mSec Memory Limit: 1024 KB Description みねちゃん是个成绩优秀大学二年级学生,本来是和像自己妹妹一般 ...
- 剑指offer:1.找出数组中重复的数(java版)
数组中重复的数:题目:找出数组中重复的数,题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任 ...
- C语言:输入10个整数,找出其中绝对值最小的数
1 输入10个整数,找出其中绝对值最小的数(10分) 题目描述 输入10个整数,找出其中绝对值最小的数 输入 十个整数 输出 绝对值最小的数 样例输入 -10 -2 30 40 50 60 70 80 ...
- C++实现 找出10000以内的完数
C++实现 找出10000以内的完数 #include <stdio.h> int main(){ int n; // 用户输入的整数 int i; // 循环标志 printf(&quo ...
- O(n)线性时间找第K大,中位数
运用快速排序的思想,可以达到线性时间找到一串数的第K大 #include<cstdio> #define F(i,a,b) for(int i=a;i<=b;i++) ],n; vo ...
随机推荐
- JIAVA知识点整理
Java具有垃圾回收机制,程序退出之后,使用的所有内存全部都将被释放,如要保存数据你就要建立文件,因为当保存时是保存在运行内存中的. int 有返回值void 不需要返回值 1.判断语句if else ...
- l2tp over ipsec
搭建教程: 转自: https://segmentfault.com/a/1190000006125737 http://www.wangyuxiong.com/blog/ti-yan-qiang-w ...
- 根据操作系统进程号,查找sql语句
有时需要根据操作系统编号查找正在执行的sql语句:select sess.username,sql1.SQL_TEXTfrom v$session sess,v$sqltext sql1,v$proc ...
- CSAPP Bomb Lab记录
记录关于CSAPP 二进制炸弹实验过程 (CSAPP配套教学网站Bomb Lab自学版本,实验地址:http://csapp.cs.cmu.edu/2e/labs.html) (个人体验:对x86汇编 ...
- onload方法注意点
function initPage() { console.log("浏览器审查元素选择日志可查看!"); } window.onload = initPage; 这里要注意,一定 ...
- ADF系列-1.EO的各个属性初探
ADF中的EO可以看做关系型数据库中表的java展现形式. 1.Type 此处的Type是java的类型,而需要映射的是数据库的类型,两者之间存在一些差异,各个映射关系如下: 数据库列类型 BC 属性 ...
- BZOJ3238:[AHOI2013]差异(SAM)
Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 HINT 2<=N< ...
- git及github配置入门
github是一个有海量开源代码库的网站,同时也是一个软件开发管理软件,作为软件来说它集成了git这个分布式的版本控制系统,可以上传.下载和管理自己的代码. 笔者刚接触不久,把认为入门应该知道的东西稍 ...
- Codeforces Round #527 (Div. 3) F. Tree with Maximum Cost 【DFS换根 || 树形dp】
传送门:http://codeforces.com/contest/1092/problem/F F. Tree with Maximum Cost time limit per test 2 sec ...
- mongo安装跟启动
mongo下载地址:http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tgz