永发信息网

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

答案:3  悬赏:60  手机版
解决时间 2021-03-29 13:21
C语言 对于给定的N各元素的数组[0;N-1],要求从中找出第K小的元素
最佳答案
有两种方法可以实现:
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个元素,就是要求的的结果。
全部回答
C语言趣味程序百例精解 百度一下前面的内容,是PDF的自己看看吧,超有用的。我只能说,原作者很好很强大!
这是根据你的程序,对程序进行了些修改,基本能够跑通。
希望能够帮到你
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] 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 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};

printf("%d \n;",select(array,0,9,5));
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
观音和佛男女带有什么讲究吗?
朝廷初议遣将,咸云非延伯无以定之,果能克敌
梦见买了两宾利小车像征什么?
女士初学高尔夫一般能打多远
《出塞》中哪一句诗表达了诗人的愤恨和不满?
打开“我的电脑”未响应
佛教是修心的吗?咋修
刚需族买房如何选择地段位置?看看这四大类
大家帮忙选个适合金融行业的网名,三个字或者
“浅反射”及“深反射”包括哪些内容?怎么答
单选题2012年2月16日,央视《焦点访谈》报道
是不是又苦又累又挨叼
dnf狂战士tp技能加点怎么加
谁有Windows XP Professional的序列号
询问供电,电表运转不正常找谁处理?
推荐资讯
永顺二手车(包头固阳县)地址在什么地方,我要
急求:洛阳水利勘测设计院刚进去一半工资在多
丝派养发馆怎么样?
为什么 日本的房子普遍都是 面积很小?
宋max和比亚迪宋是一个平台吗
小牛津双语幼儿园(光华路)地址在什么地方,想
后天中午更新版本,你们崩坏结晶换了吗
excel怎么设定比如50等于5, 51等于6呢, 51.5
揭秘,智能马桶盖进口真的比国产好吗
--Why has he been staying at home these da
怎么对付风流浪子
重型车空气滤芯如何选购
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?