找n个数字中第k小的元素



利用快速排序的方法寻找第k小的数据,该方法的时间复杂度平均为O(n),可以满足一般情况下的查找算法

#include <stdio.h>


// res代表开始查找的元素的地址,n代表查找的范围,nTh代表查找该范围内的第nTh小的元素

int FindNth(int*res,int n,int nTh)           
{

//如果查找的范围为1,直接返回该元素
 if (n<=1)
 {
  return *res;
 }

 int i=0,j=n-1;
 int temp=*res;

 while (i<j)
 {
  while (res[j]>=temp && i<j)
  {
   j--;
  }
  if (i<j)
  {
   res[i]=res[j];
  }
  while(res[i]<=temp && i<j)
  {
   i++;
  }
  if (i<j)
  {
   res[j]=res[i];
  }
 }

 res[i]=temp;

//如果刚好找到该元素则直接返回

 if (i==nTh-1)
 {
  return res[i];
 }

//如果该元素在右边(即是元素值较大的那边,修改查找范围,在该范围内寻找第nTh-i-1小的元素)
 if (i<nTh-1)
 {
  return FindNth(res+i+1,n-i-1,nTh-i-1);
 }

//修改查找范围,寻找第nTh小的元素
 else
 {
  return FindNth(res,i,nTh);
 }
}

int main()
{
 int n,data[1000],nTh;
 scanf("%d%d",&n,&nTh);
 for (int i=0;i<n;i++)
 {
  scanf("%d",&data[i]);
 }

 printf("%d\n",FindNth(data,n,nTh));
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章