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

news/2024/10/18 14:13:30/

今天分享一个小技巧,虽然是小技巧但是还是很有价值的,曾经是微软的面试题。题目是这样的,一个无序的数组让你找出第k小的元素,我当时看到这道题的时候也像很多人一样都是按普通的思维,先排序在去第K个,但是当数组非常大的时候,效率不高,那有没有简单的方法了,其实我们早就学过,只是我们不善于思考和变通。很多人刚开始非常热衷于各种排序算法只是了解却没深究,这个题目的复杂度是O(n),原理就是快速排序里面的划分算法。

分析:快速排序选择一个pivot对数组进行划分,左边小于pivot,右边大于等于pivot,所以我们计算左边小于pivot(加上pivot)的个数count总共有多少,如果等于k,正是我们所要的,如果大于k,说明第k小的数在左边,那就在左边进行我们的递归;否则,在右边,那么说明右边的第k-count小的数就是我们所要的,在右边进行我们的递归。

代码如下:

#include"stdio.h"

int GetMinK(int A[],int n,int k)

{

int s=-1,i=0,j=n-1,temp;

int beg=i;

int end=j;

while(s!=k)

{

beg=i;

end=j;

temp=A[i];

while(i

{

while(i=temp)j--;A[i]=A[j];

while(i

}

A[i]=temp;

s=i;

if(s==k)

return A[k];

if(s>k){i=beg;j--;} //在左侧寻找

if(s

}

}

int main()

{

int A[]={2,3,4,1,5,10,9,7,8,6};

int k=3;

printf("第%d小元素为:(从0开始)\n%d ",k,GetMinK(A,10,k));

return 0;

}


http://www.ppmy.cn/news/714134.html

相关文章

1的k次方一直加到n的k次方c语言,c语言函数求1到n的k次方和

#include #include /*----------------函数f2,求n的k次方-----------------*/ long f2(int n, int k) { long power n; /*power表示n的k次方*/ int i; for(i 1; i { power power*n; return power;/*将power作为f2的返回值*/ } } /*----------------函数f1&…

c语言编程最后j和k,C语言学习笔记:IJK运算,ijk,的,操作

表达式 i < j < k 在C语言中是合法的&#xff0c;但是它不是你所期望的意思。因为 &#xff1c; 运算符是左结合的&#xff0c; 所以这个表达式等价于 (i < j) < k . 换句话说&#xff0c; 表达式首先检测l.是否小千j, 然后用比较后产生的结果1或0来和K进行比较。 …

c语言学习-编写函数求组合数C= n! / (k! *( n-k)!)

编写函数求组合数C n! / (k! *( n-k)!) 程序流程图&#xff1a; 代码&#xff1a; #include<stdio.h> int mul(int x,int y); void main() { int n,k; double c; printf("please enter n:\tk:\t"); scanf("%d,%d",&n,&k); cmul(n,k); pr…

简洁解释k++,++k,k+1,k+=1的区别(附图)

以下为结合图进行说明 k和k两者都是递增1&#xff0c;但区别就在于k是先赋值给n再&#xff08;nk&#xff09;&#xff0c;而k是先后再赋值给n&#xff08;nk&#xff09;。 但两者不论是哪一种&#xff0c;区别也仅在于执行那一行&#xff0c;执行结束之后&#xff0c;对k来…

1的k次方到n的k次方

#include<stdio.h> #include<math.h> void sun(int k,int n) {int s0,i;for(i1;i<n;i)spow(i,k);printf("输出和是&#xff1a;%d\n",s); } int main() {int s0,k,n;printf("请输入两个整数K和N&#xff1a;\n");scanf("%d %d",&…

n个数中找最大数c语言,N个数中找到第K大的数值(C语实现)

N个数中找到第K大的数值(C语实现) N个数中找到第K大的数值(C语实现) 研究生了,选了计算机算法这门课程,这周布置了一个作业,在OJ上做:**N个数中找到第K大的数值**。大一简单学过C语言基础,目前只能用C语言编程,后续会学C++编程。 分享一份不超时的C语代码~ 测试例子: 思…

c语言之标准(KRC 、c89、c99、c11)

K&R C 1978年&#xff0c;丹尼斯•里奇&#xff08;Dennis Ritchie&#xff09;和布莱恩•柯林汉&#xff08;Brian Kernighan&#xff09;合作出版了《C程序设计语言》的第一版。书中介绍的C语言标准也被C语言程式设计师称作“K&R C”&#xff0c;第二版的书中也包含了…

计算智能——K-means聚类算法C语言代码

K-means聚类算法 也称K均值聚类算法 是一种迭代求解的聚类分析算法&#xff0c;其步骤是随机选取K个对象作为初始的聚类中心&#xff0c;然后计算每个对象与各个种子聚类中心之间的距离&#xff0c;把每个对象分配给距离它最近的聚类中心。 1. K-Means原理 上图a表示最初的对象…