问题描述:给定由n个互不相同的数组成的集合S以及正整数k≤n,试设计一个O(n)时间算法找出S中最接近S的中位数的k个数。

算法描述:

  1. 用线性时间选择实现的算法找到中位数
  2. S’=除去中位数外的S
  3. S"=|S'中的数值-中位数的值|
  4. 用线性时间选择实现的算法找到第k个最小的数
  5. 输出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个临近中位数的数的更多相关文章

  1. 数据结构和算法(Golang实现)(8.2)基础知识-分治法和递归

    分治法和递归 在计算机科学中,分治法是一种很重要的算法. 字面上的解释是分而治之,就是把一个复杂的问题分成两个或更多的相同或相似的子问题. 直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合 ...

  2. Java使用递归找出某目录下的所有子目录以及子文件

    /* 使用递归找出某目录("C:\\JavaProducts")下的所有子目录以及子文件 */ import java.util.*; import java.io.*; publ ...

  3. [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 ...

  4. 从长度为 M 的无序数组中,找出N个最小的数

    从长度为 M 的无序数组中,找出 N个最小的数 在一组长度为 n 的无序的数组中,取最小的 m个数(m < n), 要求时间复杂度 O(m * n) 网易有道面试题 const minTopK ...

  5. FZU みねちゃんの修罗场(从一堆出现三次的数中找出出现两次的数)

    みねちゃんの修罗场 Time Limit: 5000 mSec     Memory Limit: 1024 KB Description みねちゃん是个成绩优秀大学二年级学生,本来是和像自己妹妹一般 ...

  6. 剑指offer:1.找出数组中重复的数(java版)

    数组中重复的数:题目:找出数组中重复的数,题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任 ...

  7. C语言:输入10个整数,找出其中绝对值最小的数

    1 输入10个整数,找出其中绝对值最小的数(10分) 题目描述 输入10个整数,找出其中绝对值最小的数 输入 十个整数 输出 绝对值最小的数 样例输入 -10 -2 30 40 50 60 70 80 ...

  8. C++实现 找出10000以内的完数

    C++实现 找出10000以内的完数 #include <stdio.h> int main(){ int n; // 用户输入的整数 int i; // 循环标志 printf(&quo ...

  9. O(n)线性时间找第K大,中位数

    运用快速排序的思想,可以达到线性时间找到一串数的第K大 #include<cstdio> #define F(i,a,b) for(int i=a;i<=b;i++) ],n; vo ...

随机推荐

  1. 【Leetcode】【Medium】Unique Paths II

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  2. July 22nd 2017 Week 29th Saturday

    If you are not brave enough, no one will back you up. 如果你不够勇敢,没人会替你坚强. I was told that the real man ...

  3. JS中confirm弹出框

    if(confirm("确定要删除该任务吗?")){ $.post("findTaskById.action",{taskId:taskId},function ...

  4. HDU 1698 【线段树,区间修改 + 维护区间和】

    题目链接 HDU 1698 Problem Description: In the game of DotA, Pudge’s meat hook is actually the most horri ...

  5. redis安装和简介(1)

    一.Redis 简介 Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: R ...

  6. 给windows添加路由

    route add 10.0.0.0 mask 255.0.0.0 172.16.1.253 -p

  7. MVC学习十三:RouteDebugger插件应用

    1.下载第三方程序集RouteDebugger https://files.cnblogs.com/files/WarBlog/RouteDebugger.rar 2.把RouteDebugger程序 ...

  8. CToolBarCtrl基本内容控件

    基本内容CToolBarCtrl CObject └CCmdTarget └CWnd └CToolBarCtrl CToolBarCtrl类提供了Windows工具条通用控件的性能.这个控件(也就是C ...

  9. python单元测试unittest框架

    环境:PyCharm 2016.2 + python 3.5 待测试的类:(Widget.py) 测试类:(Auto.py) 测试结果: 总结:1.第一步:先写好测试类2.第二步:导入unittest ...

  10. openmax component类的继承关系

    向OpenCORE里继承一个新的codec时,需要用到OpenMAX接口规范对该codec进行封装,即要定义一个用于封装的类(wrapper),实现OpenMAX规定的集中核心方法(omx core  ...