顺序统计量

一、顺序统计量

        定义:将长度为 n 的数组按升序排序后,第 i 个位置的数字是该数组的第 i 小的量,称之为第 i 顺序统计量。

则一个数组中的最小值是第1顺序统计量,最大值是第n顺序统计量,中位数是第 (n+1)/2 顺序统计量 (向下取整)

二、求最大值和最小值

        最简单的方法就是将数组扫描一遍,找出其中的最大值与最小值,求出第1顺序统计量和第n顺序统计量。 时间复杂度即为 O(n)

#include<stdio.h>
#include<string.h>
int maxn,minn=100001,n,a[10001];
int max(int a,int b)
{if(a<b) return b;else return a;
}
int min(int a,int b)
{if(a<b) return a;else return b;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++){maxn=max(maxn,a[i]);minn=min(minn,a[i]);}printf("%d %d",maxn,minn);return 0;
} 

三、求第k顺序统计量

        借助排序算法,直接通过已排序的数组 a [k] 即可完成,时间为排序算法的时间,快速排序,归并排序O(nlogn) ,冒泡排序,插入排序O(n^{2}),但是这些方法无疑浪费时间,排序进行了许多不必要的操作。

        数组的划分

        快速排序是通过数组的划分实现的,数组划分有多种方法。

        1.第一种划分方法

// 以 a[left]为基准,将操作后的数组变为 a[left]所在位置的左边全部都小于 a[left]
// a[left]所在位置的右边全部都大于 a[left]
//即若k为a[left]的下标 a[left]为第k顺序统计量                               if(left>=right) return;int temp=a[left];int i=left,j=right;while(i!=j){while(a[j]>=temp && i<j) j--;while(a[i]<=temp && i<j) i++;int t=a[i]; a[i]=a[j]; a[j]=t;}int t=a[left]; a[left]=a[i]; a[i]=t;

算法实现过程: 这里可以了解到具体操作 (深入理解快速排序) 

         2.第二种划分方法

// 第二种划分方法,此时快速排序伪代码int partition(int a[],int left,int right)
{int x=a[right];int i=left-1;for(int j=left;j<=right-1;j++)if(a[j]<=x){i++;swap(a[i],a[j]);}swap(a[i+1],a[right]);return i+1;
}
void quick_sort(int a[],int l,int r)
{if(l<r){int q=partition(a,l,r);quick_sort(a,l,q-1);quick_sort(a,q+1,r);}} 

 算法实现过程:以 a[]=[2,8,7,1,3,5,6,4]为例

      法一   数组划分求出第k顺序统计量

        1.先将数组中的某个元素(通常为数组末尾元素)按照上述方法划分左右两个区域(左边元素小于该元素,且右边元素大于该元素),并求出该元素的下标 a[ q ],此时该元素为 第 q 顺序统计量。

        2.需要知道第k顺序统计量,则需要k与q进行比较,若 k<q 则只需要在左区域中找出第k小的数即可,同理若 k>q ,需要在右区域中找出第 k-q 小的数。

        3.依次不断递归,直至划分出第k顺序统计量为止。

注意:每次数组划分元素后返回的q是数组下标,若某区域 [ l , r ] 中的元素通过划分返回的q,对应在区域中的顺序统计量为 q-l+1

int randselect(int a[],int l,int r,int k)
{int q=partition(a,l,r);int x=q-l+1;  // 在[l,r]的第x位  [1,n]的第q位 if(x==k) return a[q];if(k<x) return randselect(a,l,q-1,k);else return randselect(a,q+1,r,k-x); 
}

法二  select算法----最坏情况为线性时间的选择算法

算法实现思路:

 难点: select 函数 寻找中位数的中位数函数 find

关于select函数:

        先找出中位数的中位数,再通过数组划分将数组以该数为基准划分。

关于find函数:

        先将所有的数分为若干个小组,再在每个小组通过插入排序的方法,取出所有小组的中位数构成一个中位数数组(对于多出来的若干个元素同样取其中位数),再通过select选择算法,找出中位数数组的中位数(涉及两个函数的互相递归,较繁琐)

取中位数代码(注意区域左端L):

for(int i=1;i<num;i++)  // 找出每组的中位数,并将其归为一个数组 mid[i]=ar[5*i-3+l];
if(h%5==0) mid[num]=ar[5*num-3+l];
else   mid[num]=ar[5*(num-1)+l+(h%5-1)/2];

如图:找出中位数数组的中位数43,再进行partition将整个数组划分,再重复递归下去,直至找到需要找的那个第k顺序统计量 。

#include<stdio.h>
#include<iostream>
using namespace std; 
#include<string.h>
int a[10001],n,num,k;
int mid[10001];
int find(int ar[],int l,int r);
void insertsort(int l,int r) // 插入排序 
{for(int i=l;i<=r;i++){int x=a[i];int j=i-1;while(j>=l && a[j]>x){a[j+1]=a[j];j--;}a[j+1]=x;}
}
int partition(int ar[],int l,int r,int t)  // 数组划分 
{int i=l-1;int k;for(int j=l;j<=r;j++)if(ar[j]==t) k=j;swap(ar[k],ar[r]);for(int j=l;j<r;j++){if(ar[j]<=t){i++;swap(ar[j],ar[i]);}}swap(ar[i+1],ar[r]);return i+1;
}
int select(int ar[],int l,int r,int q)
{if(l>=r){return ar[l];}int t=find(ar,l,r);  //返回的 t 代表的是 存储每一组中位数的临时数组的中位数int mi=partition(ar,l,r,t);int k=mi-l+1;  //得到低区的元素个数if(q==k){  //表明已经找到该元素 return ar[mi];} else if(q<k){  //则要递归在 低区查找 return select(ar,l,mi-1,q);}else{  //递归在高区查找 return select(ar,mi+1,r,q-k);  //在整个数组中的第i小元素在高区应该是 第 i-k 小元素了 }
}
int find(int ar[],int l,int r)
{int h=r-l+1;if(h%5==0) num=h/5;else num=h/5+1;int p1=l,p2=min(p1+4,r);for(int i=1;i<=num;i++)  // 将每含5个元素的组进行插入排序 {insertsort(p1,p2);p1=min(p2+1,r);p2=min(p1+4,r);}for(int i=1;i<num;i++)  // 找出每组的中位数,并将其归为一个数组 mid[i]=ar[5*i-3+l];if(h%5==0) mid[num]=ar[5*num-3+l];else   mid[num]=ar[5*(num-1)+l+(h%5-1)/2];if(num==1) return mid[1];else return select(mid,1,num,(1+num)/2);  //找出中位数的中位数 
}
int main()
{scanf("%d",&n);scanf("%d",&k);for(int i=1;i<=n;i++) scanf("%d",&a[i]);printf("%d",select(a,1,n,k+1));return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/300723.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C-结构体对齐

结构体对齐&#xff08;Struct Alignment&#xff09;&#xff1a;是计算机编程中的一个概念&#xff0c;通常用于描述编译器如何安排结构体的成员在内存中的存储方式。 在很多计算机体系结构中&#xff0c;访问未对齐的数据可能会导致性能下降&#xff0c;甚至是程序崩溃。为了…

rsync 远程同步----------安全高效的异地备份策略

目录 一、rsync介绍 rsync和cp的区别 rsync和scp的区别 二、rsync同步方式 rsync备份的方式 三、配置rsync源服务器 ①本地复制 ②下行同步 ③上行同步 四、常用Rsync命令 五、配置源的两种表达方法 六、部署rsync下行同步 ①环境准备 ②配置rsync源服务器-------…

Spring源码解析-容器基本实现

spring源码解析 整体架构 defaultListableBeanFactory xmlBeanDefinitionReader 创建XmlBeanFactory 对资源文件进行加载–Resource 利用LoadBeandefinitions(resource)方法加载配置中的bean loadBeandefinitions加载步骤 doLoadBeanDefinition xml配置模式 validationMode 获…

HTTP 常见的状态码以及其适用场景

是什么 HTTP状态码&#xff08;英语&#xff1a;HTTP Status Code&#xff09;&#xff0c;用以表示网页服务器超文本传输协议响应状态的3位数字代码 它由 RFC 2616规范定义的&#xff0c;并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774与 RFC 4918等规范扩展 简单来讲&#…

FPGA + 图像处理(三)生成3x3像素矩阵

前言 生成NxN的像素矩阵是对图像进行各类滤波操作的基本前提&#xff0c;本文介绍一种通过bram生成3x3矩阵的方法。 程序 生成bram核 因为本文介绍的是基于bram生成的3x3像素矩阵&#xff0c;所以要先生成两个bram核&#xff0c;用于缓存前两行图像数据 在 IP catalog中选…

【LeetCode热题100】74. 搜索二维矩阵(二分)

一.题目要求 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;…

特别详细的Spring Cloud 系列教程1:服务注册中心Eureka的启动

Eureka已经被Spring Cloud继承在其子项目spring-cloud-netflix中&#xff0c;搭建Eureka Server的方式还是非常简单的。只需要通过一个独立的maven工程即可搭建Eureka Server。 我们引入spring cloud的依赖和eureka的依赖。 <dependencyManagement><!-- spring clo…

CentOS7.9.2009安装elasticsearch7.11.1(单节点)

本文章使用CentOS7.9.2009服务器安装elasticsearch7.11.1软件 1.服务器信息 [root@elasticsearch ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@elasticsearch ~]# [root@elasticsearch ~]# cat /etc/hosts | grep elasticsearch 192.168.10.24…

【MacBook系统homebrew镜像记录】

安装 使用Homebrew 国内源安装脚本,贼方便&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"切换至清华大学镜像源&#xff1a; 命令合并&#xff1a; 分别切换了 brew.git、 homebrew-core.git、 homebrew-…

windows一键休眠,一键唤醒

1.使windows睡眠不可用&#xff0c;cmd以管理员身份运行&#xff1a; powercfg.exe /hibernate off 2.桌面创建快捷键 Rundll32.exe Powrprof.dll,SetSuspendState Sleep

探索7个MAMP本地开发环境的高效替代软件

什么是本地开发环境 本地开发环境是Web开发环境中的一种类型&#xff0c;它是指开发者自己的计算机上配置的一套用于开发和测试网站或应用程序的软件集合。这套环境使得开发者可以在本地计算机上构建和测试网站&#xff0c;而无需实时部署到服务器。 创建本地开发环境有两种方…

ubuntu系统安装k8s1.28精简步骤

目录 一、规划二、环境准备2.1 配置apt仓库配置系统基本软件仓库配置k8s软件仓库安装常用软件包 2.2 修改静态ip、ntp时间同步、主机名、hosts文件、主机免密2.3 内核配置2.4 关闭防火墙、selinux、swap2.5 安装软件安装docker安装containerd安装k8s软件包 三、安装配置k8s3.1 …

文本识别 OCR 解决方案

Capture2Text 便携式 OCR 工具 Capture2Text 能够使用键盘快捷键快速对屏幕的一部分进行 OCR。 默认情况下&#xff0c;生成的文本将保存到剪贴板。支持中文、英文、法文、德文、日文、韩文、俄文、西班牙文等 90 多种语言。 Capture2Text 是便携式工具&#xff0c;不需要安装…

【单源最短路 图论】882. 细分图中的可到达节点

作者推荐 视频算法专题 本文涉及知识点 单源最短路 图论 LeetCode 882. 细分图中的可到达节点 给你一个无向图&#xff08;原始图&#xff09;&#xff0c;图中有 n 个节点&#xff0c;编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链&#xff0c;每条边之间…

编程杂谈-代码review

目录 1. 关于智商 2. 关于能力 3. 关于changelist 3.1 关于CL内容编写 3.2 关于CL的大小 3.3 处理审稿人的意见 4. 关于代码审查 一个人的编程能力怎么去衡量&#xff1f;特别是在面试中&#xff0c;怎么避免“高分低能儿”、“专业做题家”、“面试造火箭”&#xff0c…

【JavaEE】_Spring MVC项目获取Session

目录 1. 使用servlet原生方法获取Session 1.1 错误获取方法 1.2 正确获取方法 2. 使用Spring注解获取Session 3. 使用Spring内置对象获取Session 1. 使用servlet原生方法获取Session .java文件内容如下&#xff1a; setSession方法用于设置Session对象的内容&#xff1b;…

LeetCode-74. 搜索二维矩阵【数组 二分查找 矩阵】

LeetCode-74. 搜索二维矩阵【数组 二分查找 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;先二分查找行&#xff0c;再二分查找列。解题思路二&#xff1a;暴力遍历&#xff0c;也能过。解题思路三&#xff1a;用python的in。 题目描述&#xff1a; 给你一个满足下述两条…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果 一、简单介绍 二、简单视频倒放效果实现原理 三、简单视频倒放效果案例实现…

切比雪夫窗函数

Skip to content 产品解决方案学术支持社区活动 获取 MATLAB登录到您的 MathWorks 帐户 Help Center 搜索帮助中心 帮助中心 Off-Canvas Navigation Menu Toggle Documentation Home Signal Processing Signal Processing ToolboxSpectral AnalysisWindows chebwinON…

JetBrains IDE 2024.1 发布 - 开发者工具

JetBrains IDE 2024.1 (macOS, Linux, Windows) - 开发者工具 CLion, DataGrip, DataSpell, Fleet, GoLand, IntelliJ IDEA, PhpStorm, PyCharm, Rider, RubyMine, WebStorm 请访问原文链接&#xff1a;JetBrains IDE 2024.1 (macOS, Linux, Windows) - 开发者工具&#xff0…