当前位置: 首页 > news >正文

线性时间界的选择第k大元素的算法

本文主要参考《算法导论》第三版9.2 9.3节描述的线性时间界的选择第k大元素的算法第一个算法期望运行时间为线性,这是一个广为人知的经典算法利用快速排序的划分算法,选择枢轴进行划分,结束后如果枢轴是第n大元素且nk则枢轴即为所求,如果nk则递归地在n右边的子序列寻找k-n大的元素否则递归地在n左边的子序列寻找第k大元素直到找到所需元素该算法的期望运行时间为线性,证明及伪代码请参考算法导论9.2节第二个算法最坏运行时间为线性,假设算法在一个长为n的元素序列中寻找第i小的元素以下是算法导论9,3节对该算法的描述:1将输入的元素划分为[n/5]组五个元素为一组至多有一组由剩下的n mod 5个元素组成2寻找这ceil(n/5)组中每一组的中位数:首先对每组元素插入排序确定每组元素的中位数3对第二部找出的ceil(n/5)组个中位数,递归调用找出其中位数x4按x对输入序列进行划分,设划分结束后x是第k小的元素5若ik 返回x,若ik则在x左侧子序列递归找出第i小元素否则在x 右侧子序列递归找出第i-k小的元素该算法最坏运行时间为线性证明见算法导论9.3节以下实现用迭代形式实现第一个算法用递归形式实现第二个算法,并且把第二个算法需要用到的插入排序改为其变体希尔排序c代码:#includeiostream#includealgorithm#includevector#includerandomusingnamespacestd;templatetypenameTvoidshellSort(vectorTvalue_seq,vectorsize_tseq,size_t left,size_t right){size_t gapseq.size();while(true){for(size_t i0;igap;i){for(size_t jleftigap;jright;jgap){size_t tempseq[j];size_t kj-gap;for(;;k-gap){if(value_seq[temp]value_seq[seq[k]]){seq[kgap]seq[k];}else{seq[kgap]temp;break;}if(kileftgap){seq[ileft]temp;break;}}}}if(gap1){break;}gapgap/31;}}size_tdivide(vectorintvalue_seq,vectorsize_tseq,size_t left,size_t right,size_t pivot){swap(seq[right],seq[pivot]);intpseq[right];while(leftright){while(leftrightvalue_seq[seq[left]]value_seq[p]){left;}seq[right]seq[left];while(leftrightvalue_seq[seq[right]]value_seq[p]){--right;}seq[left]seq[right];}seq[left]p;returnleft;}size_tSelect(vectorintvalue_seq,vectorsize_tseq,size_t left,size_t right,size_t rank){if(leftright){returnseq[left];}vectorsize_tmid_number_list((right-left1)/51);vectorinttemp(mid_number_list.size());size_t ileft4;for(;iright;i5){shellSort(value_seq,seq,i-4,i);mid_number_list[(i-left)/5](i-left)/5;temp[(i-left)/5]value_seq[seq[i-2]];}size_t last_index;if(i-4right){shellSort(value_seq,seq,i-4,right);mid_number_list.back()mid_number_list.size()-1;temp.back()value_seq[seq[(righti-4)/2]];last_index(righti-4)/2;}else{mid_number_list.pop_back();temp.pop_back();}size_t midSelect(temp,mid_number_list,0,mid_number_list.size()-1,(mid_number_list.size()1)/2);if(i-4right||mid!mid_number_list.size()-1){midmid*52left;}else{midlast_index;}middivide(value_seq,seq,left,right,mid);if(mid1-leftrank){returnSelect(value_seq,seq,left,mid-1,rank);}elseif(mid1-leftrank){returnSelect(value_seq,seq,mid1,right,rank-mid-1left);}else{returnseq[mid];}}size_tcommonDivide(vectorintvalue_seq,vectorsize_tseq,size_t left,size_t right){intpseq[right];while(leftright){while(leftrightvalue_seq[seq[left]]value_seq[p]){left;}seq[right]seq[left];while(leftrightvalue_seq[seq[right]]value_seq[p]){--right;}seq[left]seq[right];}seq[left]p;returnleft;}size_tcommonSelect(vectorintvalue_seq,vectorsize_tseq,size_t left,size_t right,size_t rank){while(true){size_t divide_pointcommonDivide(value_seq,seq,left,right);if(divide_point1-leftrank){rankrank-(divide_point1)left;leftdivide_point1;}elseif(divide_point1-leftrank){rightdivide_point-1;}else{returnseq[divide_point];}}}intmain(){constintN123;vectorintinput(N);for(inti0;iN;i){input[i]i1;}shuffle(input.begin(),input.end(),default_random_engine());cout输入序列:;for(constautorun:input){coutrun ;}coutendl;for(inti1;iN;i){vectorsize_tseq(N);for(size_t j0;jN;j){seq[j]j;}size_t indexSelect(input,seq,0,seq.size()-1,i);coutSelect计算结果:endl;cout第i大的数:input[index] 位置:index1endl;for(size_t j0;jN;j){seq[j]j;}indexcommonSelect(input,seq,0,seq.size()-1,i);coutcommonSelect计算结果:endl;cout第i大的数:input[index] 位置:index1endl;}return0;}
http://www.gsyq.cn/news/1394634.html

相关文章:

  • 策略模型中的 KS 和 LIFT 指标详解
  • hgdb运行日志保存周期配置详解
  • GraRep++:图表示学习中多跳邻居的差异化加权建模
  • Halcon手眼标定实战:从“眼在手外”到“眼在手上”的九点标定全流程拆解
  • iOS应用签名终极指南:3分钟掌握App重签名技巧
  • 智能网页归档解决方案:一站式实现高效离线浏览
  • 基于ESP8266的智能PIR报警器DIY:从传感器原理到物联网安防实战
  • Bokeh数据可视化核心:NumPy、Pandas与ColumnDataSource演进实践
  • 华为交换机Port-isolate配置避坑指南:隔离组互访、模式选择这些细节别搞错
  • 收藏!小白程序员必看:如何快速入门AI Agent,抢占未来职场红利?
  • EyesGuard:终极Windows用眼保护工具完全指南,轻松告别数字眼疲劳
  • Django-ecommerce电商项目架构拆解与实战指南
  • 给嵌入式Linux新手:手把手教你读懂设备树DTS里的compatible、reg和#address-cells
  • 从自平衡电桥到2MHz LCR表:四通道并行I-V架构的工程实践
  • 【操作系统】分页存储管理:从公式推导到实战计算的深度解析
  • 别再死记硬背IIC时序了!用STM32CubeMX+逻辑分析仪,5分钟搞定AT24C02驱动
  • 从Matlab仿真到FPGA上板:一条龙搞定(2,1,7)卷积码的编译码系统
  • 机器学习赋能库仑爆炸成像:从高维动量数据中解析分子三维结构
  • ESB是什么?2026年AI时代ESB的选型与避坑指南
  • STM32量产烧录不求人:用J-Flash批量烧写HEX文件的完整配置流程与脚本自动化
  • QMCDecode终极指南:三步搞定QQ音乐加密格式转换,免费实现音频自由
  • S2ESCC:基于光谱结构增强与多子视图对比的高光谱图像深度聚类方法
  • 在Mac桌面优雅显示歌词:LyricsX 2.0快速上手指南
  • Winhance中文版:重新定义你的Windows优化体验
  • PoLyScriber:端到端集成微调框架,解决多音音乐歌词转录难题
  • 哈密外贸建站哪家正规?WaiMaoYa 外贸鸭高性价比建站,小成本撬动全球大市场 - 外贸独立站运营
  • 利用模型广场为不同编程语言选择擅长的大模型
  • 中小团队如何通过Taotoken实现可控的AI模型调用成本
  • 在智能客服系统中集成Taotoken实现多模型灵活调度
  • 选家装公司口碑排行常踩的三个坑:多家真实对比一文了解 - 资讯速览