分治与递归-找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 ...
随机推荐
- 大数据学习---大数据的学习【all】
大数据介绍 什么是大数据以及有什么特点 大数据:是指无法在一定时间内用常规软件工具对其内容进行抓取.管理和处理的数据集合. 大数据是一种方法论:“一切都被记录,一切都被数字化,从数据中寻找需求,寻找知 ...
- unity3d中设计模式的学习<一>:泛型单例
单例是游戏开发中比较常见的设计模式,虽然针对的功能不同,但是有一些功能还是共有的,代码也不少,如果能放在一个基类里面是最好不过了,但是单例里需要有个instance功能来返回当前对象,所以这个功能必须 ...
- bzoj5152 [Wc2018]通道
题目链接 正解:不会做. 写一个爬山算法就过官方数据了(逃 具体来说就是每次随机一个根,然后迭代找最长路的那个点. 多随机几次取$max$就行了.正解以后再补.. #include <bits/ ...
- 2019.1.3 Mac安装免费版StarUml3.0.2 &&&Xmind思维导图 &&Google浏览器***版
下载StarUml http://staruml.io/ 好像需要FQ 附赠一个 链接:https://pan.baidu.com/s/1_pa9LwopowhOTum5g89zZQ 密码:fxtc ...
- iOS 帧动画之翻转和旋转动画
记录两个比较简单的动画,一个是翻转的动画,一个是旋转的动画. 旋转动画: 1 [UIView animateWithDuration:3 animations:^{ if (formView) { f ...
- 一个jquery ajax例子
上次搞了个jquery的AutoComplete效果,感觉很久没写jquery了,趁热打铁,再找点东西练练手.这不,看了一下jquery手册,顺便写了一个小例子,源码我直接贴上来了. 1.新建一个 ...
- 如何在jsp页面获取系统时间
<%@ page import="java.util.*"%> //获取系统时间必须导入的 <%@ page import="java.text.*&q ...
- Python之基本排序算法的实现
import cProfile import random class SortAlgorithm: def __init__(self,unsortedlist=[]): self.unsorted ...
- 【2017001】IList转DataTable、DataTable转IList
IList转DataTable.DataTable转IList using System; using System.Collections.Generic; using System.Compone ...
- unittest单元测试框架之unittest案例(二)
1.待测方法: # 加法,返回 a+b 的值 def add(a,b): return a+b # 减法,返回 a-b 的值 def minus(a,b): return a-b # 乘法,返回 a* ...