问题描述

随机生成含有n个不同元素的数组L(n≥10000),要求找出第k小的元素(k≤n),完成下面的任务:
(1)设计一个基于排序选择算法程序,编程调试正确(排序算法自己确定)。
(2)设计一个时间复杂度为O(n)的选择算法,编程调试正确。
(3)从理论上分析上述两种算法的时间复杂度,并且通过实际数据计算验证理论分析结果。
(4)写出实验报告。

问题分析

1、找出序列中的第k小元素,并将时间复杂度降低到O(n),我们首先想到的方法是利用排序,比如冒泡排序、选择排序,只排到第k小就截止,此时时间复杂度应为O(n^2 ),并不符合要求。
2、根据分治法思想,有如下思路:
对于集合A[1…n]中的元素,用其中某元素V进行划分:



if ,问题归结为在A_1中找第k小元素
else if ,V就是第K小元素
else if ,问题归结为在A_3中寻找第 小元素。
对于第一、三中情况,只需要进行递归即可。
3、时间复杂度分析,设T(n)为n元数组的时间复杂度
最坏情况下:
T(n)=T(n-1)+n-1
解得:T(n)=O(n^2 )
一般情况下:
T(n)=T(n/2)+n-1
解得:T(n)=O(n)

相关代码

int quickOnce(int *theArray, int left, int right)       // 快排的单次划分过程
{int value = theArray[left];int l = left, r = right;while (l < r){while (l<r && theArray[r]>value)r--;if (l < r){theArray[l] = theArray[r];l++;}while (l < r && theArray[l] < value)l++;if (l < r){theArray[r] = theArray[l];r--;}}theArray[l] = value;return l;
}int quickFind(int * theArray, int left, int right, int k)   //参数均为下标
{int index = quickOnce(theArray, left, right);   // 执行一次划分操作if (index < k)          // |A1|+|A2|<k 情况{return quickFind(theArray, index+1, right, k);}else if (index > k)     // |A1|>=k情况{return quickFind(theArray, left, index, k);}else                    // index正好是分界时{return theArray[index];}}

分治法实验-寻找第k小元素相关推荐

  1. Hoare选择算法 寻找第k小元素C实现 算法的“AWK脚手架和grap运行过程分析”

    现实生活中常有找"最大"."最小"及"中位数"等需求,解决这样的问题不用将整个序列排序.寻找"最大"."最小& ...

  2. 解决寻找第K小元素问题——三种不同的算法实现

    个人原创,禁止转载--Zetrue_Li 问题描述:在一个序列里找出第K小元素 以下程序基于函数 int select_kth_smallest(list q, int k) 实现 :返回向量q中第k ...

  3. 算法-寻找第k小元素(C)

    序言 刚开始我认为,寻找第k小的元素:简单呀,先对所有元素排序,之后再找不就完事啦,这时时间复杂度在O(nlgn).那有没有更好的排序的方法了呢?答案:当然是有的. 算法基本思路: (1) 当规模小于 ...

  4. 实验6-选第K小元素

    实验报告 课程名称 <算法分析与设计> 实验日期 2021 年 4 月 18 日 至 2021 年 4 月 25日 学生姓名 石晨昊 所在班级 计算机194 学号 201921221232 ...

  5. [LeetCode题解]从两个有序数组的并集中寻找第k小元素

    Given two sorted arrays A, B of size m and n respectively. Find the k-th smallest element in the uni ...

  6. C语言寻找第k小元素,小技巧——查找第k小的元素

    今天分享一个小技巧,虽然是小技巧但是还是很有价值的,曾经是微软的面试题.题目是这样的,一个无序的数组让你找出第k小的元素,我当时看到这道题的时候也像很多人一样都是按普通的思维,先排序在去第K个,但是当 ...

  7. 分治法求解最小和第二小元素

    递归函数 void Found(int a[], int l, int r, int& min1, int& min2)//递归函数 {if (l==r) {//原数组并没有改变,通过 ...

  8. 寻找中项和第k小元素c语言,分治法第k小元素poj2104.ppt

    分治法第k小元素poj2104 第六章 分 治 6.1 引言 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之. 战略 算法设计技术 划分--治理- ...

  9. 分治法实现寻找数组最大最小值

    分治法实现寻找数组最大最小值 大致思路 我们拿到一个长度为K的一维数组,想要在短时间内进行最大最小值的查找,第一种想法就是现将数组进行排序,这样首末的元素分别是最小和最大的元素.排序算法中,快速排序. ...

最新文章

  1. iOS项目的本地化处理(多国语言)
  2. linux 重定向_Unix/Linux编程实践之IO重定向和管道
  3. 大数据:技术与应用实践指南_大数据技术与应用社团 社会实践总结篇
  4. sea 配置资料收集
  5. sql server 加密_SQL Server 2016中的新功能–始终加密
  6. jmeter根据循环获取参数_Jmeter--同线程组循环获取数据库数据传递请求
  7. 百度鹰眼ajax 坐标转换,Web服务更新日志
  8. u-boot环境的擦除,默认设置,批写入
  9. php的慢查询,慢查询是什么
  10. idea中Gsonformat插件工具使用
  11. SIP协议-01 简介与入门
  12. 阿里云 python_阿里云python sdk
  13. DataV-组件配置
  14. JPA映射数据库mysql表名,字段名大小写转化,下划线分割.
  15. 在Django中进行数据库迁移
  16. 洛谷P3853 [TJOI2007]路标设置
  17. PS如何便捷的使用仿制图章和画笔工具
  18. Java课程设计基于SSM的出租房管理
  19. 摩拜OFO单车哪家强,看他们的网站似乎发现了点什么
  20. Ettercap 进行arp嗅探密码

热门文章

  1. 元数据管理、治理、系统、建设方案、范例等
  2. C语言地址传递和引用传递
  3. 第一阶段个人冲刺博客第十天
  4. C++之文件流操作(File Stream)
  5. DDR2内存参数设置
  6. Android 音频数据传输流程图 - Playback过程
  7. 有哪些好用的远程办公协作软件?
  8. 电子学:第012课——实验 11:光和声
  9. es实战-Monitoring原理讲解及kibana可视化实战
  10. java数组的插入排序以及时间复杂度