K:找寻数组中第n大的数组元素的值的三个算法

别再折腾内网穿透了!用EC600N 4G模块+STM32直连华为云IoT,保姆级避坑指南 本文详细介绍了如何利用EC600N 4G模块与STM32直连华为云IoT平台,实现物联网设备的云端数据传输。通过对比传统内网穿透方案的不足,展示了4G+云平台方案在稳定性、安全性和扩展性上的优势,并提供从硬件准备到华为云配置、MQTT连接实现的保姆级教程,帮助开发者高效完成物联网项目部署。 阅读详情

package other;

import java.util.Arrays;

/**
* 该类用于演示在一个无序的数组中寻找第n大的数的三个算法
* @author 学徒
*
*/
public class FindTHNumber
{
 int[] array=null;
 public static void main(String[] args)
 {
  FindTHNumber n=new FindTHNumber();
  n.array=new int[]{1,3,2,4,5,6};
  int low=0;
  int high=n.array.length-1;
  int th=6;
  System.out.println(n.QuicklySortedMind(th-1, low, high));
  System.out.println(n.sort(th-1));
  System.out.println(n.LinedSelectFind(th, low, high));
 }
 /**
 * 思路:排序数组,并寻找一个原本乱序的数组中的第th大的元素
 * 平均时间复杂度视具体的排序算法而定,一般是O(nlogn)
 * @param th 第th大的元素,即要找的那个元素在数组中的真实的下标的元素索引
 * @param low 数组的元素下标,表示需要进行排序的数组元素的开始的下标
 * @param high 数组元素的下标,表示需要进行排序的数组元素的结束的下标
 * @return 返回第th大的那个数组元素
  */
 public int sort(int th)
 {
  Arrays.sort(array);
  return array[th];
 }
 /**
 * 思路:使用快速排序的思想,去寻找一个乱序的数组中的第th大的元素
 * 由于快速排序的思想中,每次确定一个元素在数组中的正确位置,为此,通过比较每次
 * 查找出来的元素在数组中的正确位置和想要进行查找的位置的元素之间的关系,可以排除
 * 掉一部分元素,从而逼近答案。在最优的情况下,每次能够排除掉N/2个数组元素
 * 平均时间复杂度为O(n)
 * @param th 第th大的元素,即要找的那个元素在数组中的真实的下标的元素索引
 * @param low 数组的元素下标,表示需要进行排序的数组元素的开始的下标
 * @param high 数组元素的下标,表示需要进行排序的数组元素的结束的下标
 * @return 返回第th大的那个数组元素
 */
 public int QuicklySortedMind(int th,int low,int high)
 {
  int lows=low;
  int highs=high;
  //选择该元素为基准元素
  int midNumber=array[low];
  //以下为快速排序部分,用于将元素midNumber的值插入到数组的正确位置中
  while(low<high)
  {
   while(array[high]>midNumber&&low<high)
    high–;
   if(low<high)
   {
    array[low]=array[high];
   }
   while(array[low]<midNumber&&low<high)
    low++;
   if(low<high)
   {
    array[high]=array[low];
   }
  }
  array[low]=midNumber;
  //用于递归的寻找第n大的元素
  //当找到的那个中间的元素为要找的第th大的元素的时候,将其直接进行返回
  //ps:关键点在于,low的值即使是递归查找出来的,其依然为数组的绝对索引值
  if(th==low)
   return array[low];
  //当找到的元素的位置在想要找的元素的位置的左边时,从右边继续寻找
  else if(th>low)
   return QuicklySortedMind(th,low+1,highs);
  //当找到的元素的位置在想要找的元素的位置的右边时,从左边继续寻找
  else
   return QuicklySortedMind(th,lows,low-1);
 }
 /**
 * 采用线性时间选择的算法找出第th大的元素的值
 * 线性时间选择算法的思想为:
 * 线性时间选择算法是对上面那个基于快速选择排序算法查找第n大的数组元素的改进。具体思想如下:
 * 对数组中的元素进行分组(每组元素的个数为5个),之后找到各组中的中位数,之后再找到中位数的中位数
 * 将中位数的中位数那个元素根据快速排序的思想,找到其在数组中的正确的位置
 * 使得其每次都能够排除掉一定的数组元素,从而逼近答案
 * @param th 第th大的元素
 * @param low 数组的元素下标,表示需要进行排序的数组元素的开始的下标
 * @param high 数组元素的下标,表示需要进行排序的数组元素的结束的下标
 * @return 返回第th大的那个数组元素
 *
 */
 public int LinedSelectFind(int th,int low,int high)
 {
  //当数组元素个数小于5个的时候,即只有一组元素的时候,将其进行排序,之后直接返回
  if(high-low<5)
  {
   Arrays.sort(array,low,high);
   return array[low+th-1];
  }
  //变量i用于控制数组元素分组的迭代
  //每组5个元素,为此,总共的组别数目为(high-low-4)/5组(舍弃掉数组元素不足5个的组别,不考虑元素个数不足5个的分组)
  //其等价与i<(high-low)/5
  for(int i=0;i<=(high-low-4)/5;i++)
  {
   //变量s为每组元素的第一个元素的下标(即索引),t为每组元素的最后一个元素的下标(即索引)
   int s=low+5*i,t=s+4;
   /*for(int j=0;j<3;j++)
   {*/
   //用于排序s到t之间的数组中的每组元素的前三个数组元素
    Arrays.sort(array,s,t-2);
    //用于将每组元素中的中位数按照各组之间的区别,
    //在原数组(low到high之间的数组)中从头开始排,即原数组(low到high之间的数组)中
    // 前(high-low-4)/5个元素为各个分组的中位数
    swap(array,low+i,s+2);
   /*
   }
   */
  }
  //选择出中位数的中位数,其中在low到low+(high-low-4)/5这个范围内,其中、中位数为第(high-low+6)/10大的元素
  int x=LinedSelectFind((high-low+6)/10,low,low+(high-low-4)/5);
  //变量i为中位数的中位数那个数在数组中所在的下标位置,变量j为相对low到high这个范围的数组,元素x为其第几大的元素
  int i=partition(low,high,x),j=i-low+1;
  //进行递归查找,直到数组元素小于5个的时候
  //当th在j的左边或者相等的时候,在low到i之间继续寻找第th大的元素
  if(th<=j)
   return LinedSelectFind(th,low,i);
  //当th在j的右边的时候,在i+1到high之间,继续寻找第th-j大的元素
  else
   return LinedSelectFind(th-j,i+1,high);
 }
 //将元素x放置到p到r之间的数组元素的正确位置,并返回元素x所在的下标
 private int partition(int p,int r,int x)
 {
  int i=p,j=r+1;
  while(true)
  {
   while(array[++i]<x&&i<r);
   while(array[–j]>x);
   if(i>=j)
    break;
   swap(array,i,j);
  }
  array[p]=array[j];
  array[j]=x;
  return j;
 }
 //交换数组array中的下标为index1和index2的两个数组元素
 private void swap(int[] array,int index1,int index2)
 {
  int temp=array[index1];
  array[index1]=array[index2];
  array[index2]=temp;
 }
}

如何寻找数组中的最大值和最小值 以下五种解法可以寻找到数组中的最大值和最小值; 1)问题分解法。     把本题看做两个独立的问题,而非一个问题,所以,每次分别找出最小值和最大值即可,此时,一共需要遍历两次数组,比较次数为2N次;(N表示数组的长度)  2)取单元素法。     维持两个变量min和max,min标记为最小值,max标记为最大值,每次取出一个元素,先与已找到的最小值比较,再与已找到的最大值比较,此种方法只 阅读详情

相关推荐

作业6——分治算法求数组第k小元素

1.问题 分治算法求数组第k小元素 2.解析 将输入的数组分成n/5组元素,剩余的元素舍弃,取出每组的中项(即第三个)放在M[]中,取出M的中项mid(排序后取出中项),将原数组中所有数与mid比较,根据比较结果将原数组分成三组,再根据k值与三个数组大小的比较去相应的数组找要求的元素。 3.设计 void sort// 排序小规模的数组范围 void Select( input, size , k...

Chussuchieh的博客 1987

K:找寻数组中第n大的数组元素的三个算法

相关介绍:  给定一个数组,找出该数组中第n大的元素的值。其中,1<=n<=length。例如,给定一个数组A={2,3,6,5,7,9,8,1,4},当n=1时,返回9。解决该问题的算法有三种。依据其时间复杂度的高低,分别对其进行讲解 第一种:时间复杂度为O(NlogN)  解决该问题,容易想到的一个办法是,先对数组按元素值从大到小的方式进行排序,之后选取出其符合要求的元素...

diaosangwan0363的博客 745

Python | 快速获取某一列数组中前 N 个最大值/最小值的索引 | 三种方法总结

Python | 快速获取某一列数组中前 N 个最大值/最小值的索引 | 三种方法总结

叶庭云 成为自己的光 5593

算法题 输出第n大的数

【算法题】输出第n大的数、输出前n个大数

哆啦A梦 864

快速排序找数组中的第N大数

方法原理: 若是要找数组中第N大元素 使用快排每完成一轮排序,判断基准数的索引 和 数组长度-N 的关系 索引 = 数组长度-N : 此基准数就是要找的第N大元素 索引 > 数组长度-N : 要找的元素在左边 索引 < 数组长度-N : 要找的元素在右边 import java.util.Random; import java.util.Scanner; public class quickSortSearch { static int[] arr = new int[8]; static int N ; public static void main(String[

Modbus4J vs EasyModbus4J:哪个Java库更适合你的工业项目?

本文深入对比了Java领域两大Modbus通信库Modbus4J与EasyModbus4J。Modbus4J设计稳健、类型安全,适合复杂业务集成;EasyModbus4J基于Netty,在高并发场景下性能更优。文章从架构、性能、API及生产环境多维度分析,为工业物联网项目选型提供决策依据。

weixin_28475533的博客 312

经典算法题:寻找数组中第k大的元素

这算是一道相当经典的算法题了:在长度为N的乱序数组中寻找第k(n&gt;=k)大的元素。扩展思考:如何处理数组中的重复元素?比如,对于数组a={1,2,2,2,3,3,3},第二大的元素应该是3还是2呢?本文作这种分类:如果第二大的元素是3,说明在处理第k大的元素时不处理重复的数据,也就是将原数组进行降序排序后,下标为k-1的元素。这种处理方法称之为“不处理重复数据方法”;如果第二大的元素是2,说...

凛冬烈焰的博客 2万+

Pikachu靶场环境搭建(Windows环境下安装详细教程)

Pikachu靶场是一个漏洞测试练习平台。其中包含了常见的web安全漏洞,如果你是一个渗透测试学习者没有靶场的练手,那么pikachu是一个很好的测试平台。

weixin_42857656的博客 1826

【算法】线性时间选择——第k大(小)元素问题

文章目录前言分治算法之第k小元素分治算法之第k大元素 前言 问题:给定线性序列中 n 个元素和一个整数 k ,1 ≤ k ≤ n,要求找出元素中的第 k 小的元素 或者 第 k 大元素,要求是线性时间算法,即时间复杂度为O( n )。 需要用到快速排序的分区思想,有关分治法思想和快速排序文章:【算法】分治算法 分治算法之第k小元素 问题:给定线性序列中 n 个元素和一个整数 k ,1 ≤ k ≤ n,要求找出元素中的第 k 小的元素 ,要求是线性时间算法,即时间复杂度为O( n )。 设计思想:

高朗的博客 7481

基于STM32F407的立创球形六足双形态机器人:从Morphex复刻到毕业设计的完整开发指南

本文详细介绍了基于STM32F407主控芯片,从零开始复刻Morphex球形六足双形态机器人的完整开发过程。内容涵盖硬件选型(如总线舵机)、机械结构设计(阿基米德螺旋底盘)、软件控制(逆运动学与步态算法)以及多控制方式集成,为嵌入式系统与机器人开发的毕业设计或爱好者提供了全面的实战指南。

weixin_35414260的博客 322

wsl2上运行带有Isaac Gym的程序报错: GPU Pipeline: disabled

显示GPU Pipeline:disabled,查找相关文档发现是WSL2目前不支持Isaac Gym,时,想要在wsl2上运行,最后报错如下。

2303_78660611的博客 958

N 个元素的数组,求第K大的元素

#include #include #include using namespace std;/*N 个元素的数组,求第K大的元素*//*第一种方法:先对数组进行交换排序(递减),然后返回第K-1位置的元素*//*arr为数组,size为数组元素个数,kth是要返回的第kth位*/ int getKth_1(int arr[],int size, int kth){   for(int i=0; i    {       for(int j=i+1; j       {           if(arr[i

wangyangkobe的专栏 3251

滑模控制理论(SMC)概述

滑模控制理论(SMC)概述一、背景二、数学理论三、高维拓展四、分析 一、背景 滑模控制理论(Sliding Mode Control, SMC)是一种建立在现代控制理论基础上的控制理论,主要数学核心为李雅普诺夫函数。 滑模控制的核心思想是建立一个滑模面,将被控系统拉取到滑模面上来,使系统沿着滑模面运动。滑模控制的一个优势是无视外部扰动和不确定参数,采用一种比较“暴力”的方式达到控制的目的。 其思想和反步法有些类似,但数学实现起来更加方便而不抽象。相比反步法,滑模控制没有复杂的数学计算,也不会出现“微分爆炸”

高能阿博特的博客 6万+

【C++】寻找数组第k大元素

一、基本问题 题目:给定整数数组nums和整数k,请返回数组中第k个最大的元素。 注意:你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。 要求:时间复杂度为 O(N) 看到这个问题,我们脑袋里第一个想到的就是先把整个数组排个序,然后分下奇偶长度,取个中位数就完了。但是一看要求时间复杂度要求为 O(N) ,众所周知,基于比较的排序的时间复杂度下限为 O(NlogN) ,不基于比较的排序又不适用于 数据范围很大的情况,所以本题目要选择其他思路。 .........

saxon_li的博客 5755

Ventoy引导自定义菜单配置详解:手把手教你用ventoy_grub.cfg启动硬盘里的Manjaro

本文详细解析了Ventoy引导自定义菜单配置方法,重点介绍如何通过ventoy_grub.cfg文件启动硬盘中的Manjaro系统。从Ventoy与GRUB2的协作原理到具体配置步骤,包括分区布局设计、关键参数解析及常见问题解决方案,帮助用户实现多系统引导的灵活管理。

weixin_28738165的博客 301

使用Zed 实现测距

此代码基于官方代码基础上进行改写,主要是获取zed相机深度画面的深度值,为yolo测距打基础。Zed相机是由Stereolabs公司开发的一种先进的立体视觉相机。这种相机专为计算机视觉和机器学习应用而设计,能够提供高质量的3D捕捉和分析功能。: Zed相机配备有一对垂直排列的传感器,能够捕捉两个略有偏移的图像,从而模拟人的双眼视觉,实现深度感知。: 利用立体成像技术,Zed相机能够实时生成环境的3D模型,这对于机器人导航、增强现实(AR)和虚拟现实(VR)等应用至关重要。

weixin_45303602的博客 912

寻找数组中第k大的元素

这算是一道相当经典的算法题了: 在长度为N的乱序数组中寻找第k(n>=k)大的元素。 (1)最简单直接的方法:先排序再找 最简单直接的想法是首先进行排序。假设元素的数量不大,比如才几千个,那就可以先进行排序,比如用快排或堆排,平均时间复杂度为O(N*logN),然后取出前k个,于是总时间复杂度为O(NlogN)+O(k)=O(NlogN)。当然这种做法是浪费了不少的时间的,因为题目只要...

gcs的博客 3647

华为MetaERP PTP采购到应付全流程解析

摘要:本文系统解析华为MetaERP中的PTP(采购到应付)全流程管理方案,涵盖从采购申请到付款执行的完整业务流程。文章详细分解了PR、PO、GR、IV、AP等关键环节的财务核算规则,并提供了预算校验、库存更新等Python代码示例。同时阐述了IT落地架构设计,包括会计引擎配置、系统集成方案及银企直连支付接口实现。该方案通过三单匹配自动化和智能会计引擎,将处理效率提升10倍(200笔/人天→2000笔/人天),实现98%的自动化率,为集团企业提供了高效的数字化财务管理样板。文中所有技术方案均需根据实际场景调

金牌架构师 1743

如何在N个无序数组元素中,查找第K大元素

这个问题的解决肯定是要先排序的,然后再定位;

东哥日记 2499

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

分治算法求n个元素序列中第k个大的元素

     首先,我们应该设定产生随机数的序列存储在数组中,然后我们应该最容易想到的是排序对吧,做一个降序排序,就很容易找到第k个大的元素。但是用排序算法的话,时间复杂度最快的也是快速排序O(logn),如果我们使用分治算法求得话,会得到一个线性的时间复杂度O(n)。分治算法是将一个问题分成若干个子问题去实现。分治算法是离不开递归算法的。 怎么实现? 我们可以在数组中产生一个随机的下标,让他作为...

ly's Blog 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java 取数组中第n大的元素

遍历:算法复杂度O(n)。 对数组进行排序,直接索引到第n大的元素。算法复杂度O(nlogn)。 这里利用快速排序来解决此问题:O(n) 思路:首先找到一个元素,将它移到合适的位置,如果该元素为4,且要找第四名的元素是什么,此时就不需要考虑前面的元素了。 如果要找第6名的元素,此时就从4这个位置开始找第2名的元素,接着再进行分组,然后求出左边组中的第2名元素,依次类推。 = O(2n)...

抛弃幻想,准备斗争 2745

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【算法】快速选择算法 ( 数组中找第 K 大元素 )

使用 快速选择算法 处理数组中找第 K 大元素

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1571

python 无序列表中第k大元素_如何寻找无序数组中的第K大元素?

如何寻找无序数组中的第K大元素?有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素。比如给定的无序数组如下所示:如果k=6,也就是要寻找第6大的元素,很显然,数组中第一大元素是24,第二大元素是20,第三大元素是17...... 第六大元素是9。方法一:排序法这是最容易想到的方法,先把无序数组从大到小进行排序,排序后的第k个元素自然就是数组中的第k大元素。但是这种方法的时间复杂度是O(n...

weixin_39678493的博客 1681

算法:查找数组中第K大的元素

要查找一个数组中的第 K 大的元素,有很多方法可以实现,其中常用的方法就是使用分治算法或快速选择算法,这两种方法的时间复杂度到时候O(n)。

Lamb的博客 877

寻找无序数组中的第K大元素

分析: 方法一:排序法,先把这个无序数组进行排序,假设按照从小到大排,则第k个元素就是数组中的第k大元素。 排序的时间复杂度最快为o(nlogn) 下面用快速排序实现: #include&lt;iostream&gt; template&lt;typename T&gt; T partition(T* arr,int low,int high) { int tmp=arr[low]; whil...

qq_42111463的博客 2078

基于快速排序:如何在O(n)时间内,找到一个无序数组的第K大元素?

如何在O(n)时间内,找到一个无序数组的第K大元素? 基本思路:利用快排的思想,将无序数组array[]【左下标l,右下标r】分为三个区间,【小于第k个元素】、【等于第k个元素】、【大于第k个元素】,选取一个基准值的下标p与k相比,若比k大,则继续在【l,p-1】之间递归,若比k小,则在【p+1,r】之间递归。 平均时间复杂度:O(n+n/2+n/4+...+...

qq_1450107587的博客 2217
上一篇: K:注解处理
下一篇: K:找寻最长子序列的四个算法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值