选择N个数据中第K小的数据输出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择N个数据中第K小的数据输出相关的知识,希望对你有一定的参考价值。

输入N(N<10000)和K,接着输入N个数据,输出N个数据中第K小的元素 哪位高手知道 帮助下 谢谢拉
在分治算法的递归调用的每一个划分步骤里,放弃一个固定部分的元素,对其余元素进行递归 这个问题要求对运行时间有一定限制 对不起 刚刚忘记说了

用二分法,一般求数组中第k小的数常用该算法 :)
效率是很高的,特别是你的题目要求,N还是很小的
在毫秒级瞬间就可以完成计算的

思路是这样的:
在数组中随机找个数做中点(一般可拿数组中第一个数,或者产生一个随机数),然后从左到右遍历一遍数组,比该中点数小的放左边,比该中点数大的放右边,然后判断此时中点数的位置p,如果p<k,那么第k小的数肯定在右边,递归在右边那串数中查找第(k-p)小的数;如果p>k,那么第k小的数肯定在左边,递归在左边那串数中查找第k小的数

程序如下:
//以数组array[left]为中点,比其小的放左边,比其大的放右边,array[left]这个元素最后位置在array[middle]
int Partition(int array[],int left, int right)

int pivot=X[left];
int middle;
int L=left;
int R=right;
int tmp;
while (L<R)

while (arrya[L]<=pivot && L<=right) L++;
while (array[R]>pivot && R>=left) R--;
if (L<R)

tmp=array[L];
array[L]=array[R];
array[R]=tmp;


middle=R;
tmp=array[left];
array[left]=array[middle];
array[middle]=tmp;
return middle;

//在array[left]到array[right]里查找第k小的数,将该数返回
int select(int array[], int left, int right, int k)

int middle;
if (left==right) return left;
middle=Partition(array,left,right);
if (middle-left+1>=k) return select(array,left,middle,k);
else return select(array,middle+1,right,k-(middle-left+1));
参考技术A 输入的数据存储在A[N]=。。。。。。

for(i=0;i<N;i++)
for(j=i+1;j<N+1;j++)
if(A[i]<A[j]) //////////////排序
t=p[i];p[i]=p[j];p[j]=t;

输出A[k-1]就ok了
参考技术B 太复杂了 参考技术C 冒泡法排个序把第k-1个打印出来不就完了本回答被提问者采纳

LeetCode——668. 乘法表中第k小的数(Java)

题目描述 题干: 几乎每一个人都用 乘法表。但是你能在乘法表中快速找到第k小的数字吗? 给定高度m 、宽度n 的一张 m * n的乘法表,以及正整数k,你需要返回表中第k 小的数字。 例 1: 输入: m = 3, n = 3, k = 5 输出: 3 解释: 乘法表: 1 |2 |3 --|-|-

以上是关于选择N个数据中第K小的数据输出的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法之深入解析“乘法表中第K小的数”的求解思路与算法示例

数据结构与算法之深入解析“乘法表中第K小的数”的求解思路与算法示例

分治法线性时间选择(转)

[二分查找] 乘法表中第k小的数

AcWing 786.第k个数

LeetCode——668. 乘法表中第k小的数(Java)