sinat_31829943
2015-10-17 12:52
采纳率: 60%
浏览 5.2k
已采纳

C语言 给定一个整数序列和一个数k,求这个序列中第k小的数。

C语言 给定一个整数序列和一个数k,求这个序列中第k小的数。

我的程序

 #include<stdio.h>
int n[10000];
void Nok()
{
  int i=0,j=0,t,k,q=0;
  char c;
  scanf("%d",&n[i++]);
  c=getchar();
  while(c!='\n')
  {
      scanf("%d",&n[i++]);
      c=getchar();
  }
  t=i-2;
  k=n[i-1];//最后一个数是k
  while(k!=0)
  {   
   for(i=0;i<=t;i++)//寻找k次最小值,每次将最小值所对应变量赋值其下一变量消掉此次最小值(最后一次不变直接输出)
   {
     if(n[i]<n[q])
     {          
        q=i;
     }
   }
   k--;
   if(k==0) printf("%d\n",n[q]);
   else {n[q]=n[q+1]; q++;}
  }  
}
void main()
{
   Nok();
}

结果很奇怪不知道程序哪里有问题麻烦帮忙看一看

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • 纵横车 2015-10-17 13:11
    已采纳

    n[q]=n[q+1];这句如果q是最后一个数,呢q+1不就越界了。

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • havedream_one 2015-10-17 13:07

    先进行排序,然后再找第k小

    评论
    解决 无用
    打赏 举报
  • Evankaka 2015-10-17 14:47

    比较好的一个做法,应该是用堆来做,维护一个k个元素组成的最小堆,遍历一次,最后根元素就是你要的了
    这个题目还有很多变体,但是堆都可以来做,面试时也是比较喜欢问一问题之一。

    评论
    解决 无用
    打赏 举报
  • ONLY_YzZ 2015-10-18 05:53

    可以先对输入的一系列数进行一个有序排序,比如用冒泡法得到从小到大的排序,然后得到的n(k-1)即为所需的

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题