找出第K小的数

来源:互联网 发布:智慧记同步不了数据 编辑:程序博客网 时间:2024/05/01 12:31

题目描述: 
     
    查找一个数组的第K小的数,注意同样大小算一样大。  
    如  2 1 3 4 5 2 第三小数为3。 
    输入: 
    输入有多组数据。 
    每组输入n,然后输入n个整数(1<=n<=1000),再输入k。 

    输出: 
    输出第k小的整数。 

    样例输入: 
    6 
    2 1 3 5 2 2 
    3 

    样例输出: 
    3


代码:

void swap(int* e1,int* e2);

int searchk(int arry[],int n,int k);
void quicksort(int arry[],int left,int right);
  //找出第K小的数
void main()
{
     int n,k;
     int arry[100];
     int i;
     int ans;
     printf("输入n:");
     scanf("%d",&n);
     printf("输入数组:");
     for(i=0;i<n;i++){
          scanf("%d",&arry[i]);
     }
     printf("输入k:");
     scanf("%d",&k);

     ans=searchk(arry,n,k);
     printf("第K小数为:%d\n",ans);
    
}

  int searchk(int arry[],int n,int k)
  {
      int i,count=1;
      quicksort(arry,0,n-1);
      for(i=1;i<n;i++){
          if(arry[i-1]!=arry[i]) count++; //不相同的才计数
          if(count==k) break;
      }
      return arry[i];
  }

   void quicksort(int arry[],int left,int right) //快排
   {
       if(left>=right) return;
       int l=left;
       int r=right;
       int i=l+1;
       int tmp=arry[l];
       while(i<=r){
           if(arry[i]<tmp) swap(&arry[i],&arry[l++]) ;
           if(arry[i]>tmp) swap(&arry[i],&arry[r--]);
           if(arry[i]==tmp) i++;
       }
       quicksort(arry,left,l-1);
       quicksort(arry,r+1,right);
   }

   void swap(int* e1,int* e2)
   {
       int tmp=*e1;
       *e1=*e2;
       *e2=tmp;
   }
原创粉丝点击