C语言 对于给定的N各元素的数组[0;N-1],要求从中找出第K小的元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 对于给定的N各元素的数组[0;N-1],要求从中找出第K小的元素相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
void main()
void swap(int*x,int*y);
select(int a[],int left,int right, int k)

int i,j,pivot;
if(left>=right)
return a[left];
pivot=a[left];
i=left+1;
j=right;
while(1)

do
i=i+1;

while(a[i]<pivot);
do
j=j+1;

while(a[j]>pivot);
if(i>=j)break;
swap(&a[i],&a[j]);

if(j-left+1==k) return pivot;
a[left]=a[j];
a[j]=pivot;
if(j-left+1<k)
return select(a,j+1,right,k-j-1+left);
else
return select(a,left,j-1,k);


void swap(int *x,int *y)

int t;
t=*x;
*x=*y;
*y=t;

我写的 能帮忙改一下吗

有两种方法可以实现:
1 对数组进行从小到大排序,排序方法任意。
在排序后,数组的第K个元素即为第K小的元素。

2 对于N值较大,K值较小的情况,1中的时间开销偏大。
这时可以用额外的空间开销,来换取更高的效率。
方法为:
a) 开辟一个K个元素的临时空间M;
b) 取数组中的第一个元素,置于M中;
c) 取第二个元素,插入到M中,保证M中是从小到大排序的;
d)对于后续N中的每个元素,均自后向前遍历M,并插入到M对应位置中,保证M有序;
e)如果M中已经有K个元素,那么在插入时,新元素如果比结尾元素更大,则不插入,否则插入到对应位置,原本最后一个元素抛弃;
f)当对N的遍历结束后,存储于M中的,就是K个N中的最小元素的有序序列。此时第K个元素,就是要求的的结果。
参考技术A 这是根据你的程序,对程序进行了些修改,基本能够跑通。
希望能够帮到你
void swap(int*x,int*y);
int select(int a[],int left,int right, int k)

int i,j,pivot;
if(left>=right)
return a[left];
pivot=a[left];
i=left;
j=right+1;
while(1)

do

while(a[++i]<pivot&&i<=right);
do

while(a[--j]>pivot&&j>=left);//多加了个判断条件
if(i>=j)break;
swap(&a[i],&a[j]);

if(j-left+1==k) return pivot;
//边界情况判断
if (j==right&&i==right+1)
return select(a,left+1,right,k);

if (j==left&&i==left+1)
return select(a,left+1,right,k-1);

if(j-left+1<k)
return select(a,j+1,right,k-j-1+left);


else
a[left]=a[j];
a[j]=pivot;
return select(a,left,j-1,k);



void swap(int *x,int *y)

int t;
t=*x;
*x=*y;
*y=t;

void main()
int array[20]=1,2,3,4,5,6,7,8,9,10,11,31,12,15,18,20;
/*test*/
printf("%d \n;",select(array,0,9,5));
本回答被提问者和网友采纳
参考技术B C语言趣味程序百例精解 百度一下前面的内容,是PDF的自己看看吧,超有用的。我只能说,原作者很好很强大!

众数问题:给定含有n各元素的多重集合S,每个元素在S中出现次数成为重数。多重集S中重数最大的元素成为众

例如,S=1,2,2,2,3,5。多重集S的众数是2,其重数为3。对于给定的由n各自然数组成的多重集S,采用分治算法编程计算S的众数及其重数。
问题请按照如下格式回答:
答:①问题分析②数学模型(公式或语言描述)③算法设计④数据结构设计⑤算法实现(写出C语言代码,要求有输入和输出)⑥算法分析。

参考技术A #include <stdio.h>
int main()

int a[50];
int i,j,maxCount=0,index=0,nCount=0;
int n;
scanf("%d",&n);
for(i=0;i<n;i++)

scanf("%d",&a[i]);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

if(a[j]==a[i])
nCount++;

if(nCount>maxCount)

maxCount=nCount;
index=i;

nCount=0;

printf("%d\n%d",a[index],maxCount);
本回答被提问者采纳

以上是关于C语言 对于给定的N各元素的数组[0;N-1],要求从中找出第K小的元素的主要内容,如果未能解决你的问题,请参考以下文章

【C语言】查找:给定有10个元素的整数数组,输入一个数,在数组中查找是该数

用C语言实现一维数组中删除第N个元素的程序怎么写

【C语言】查找:给定有10个元素的整数数组,输入一个数,在数组中查找是该数

构建乘积数组

C语言,快速排序算法

#C语言初学记录(位运算)