1 //递归实现求任意次最值 2 //求数组元素中第N大的元素 3 4 5 /*优化版本*/ 6 int getMax(int *p, int len,int num)//在当前所有项中得到比num小的最大数 7 { int max = 1<<31;//int能表示的最小负数 8 int i; 9 for(i = 0;i < len;i++)10 {11 if( p[i]< num)12 {13 if(max < p[i])14 max = p[i];15 }16 }17 return max;18 }19 20 int func(int* p,int len,int n)//返回数组元素中第n大的元素21 {22 int nvalue;23 if(n == 1)24 {25 nvalue = getMax(p,len,~(1<<31));26 }27 else28 {29 nvalue = getMax(p,len,func(p,len,n-1));30 }31 return nvalue;32 }33 34 35 36 /*基础版本*/37 int func2(int* p,int len,int n)//返回数组元素中第n大的元素38 {39 int i;40 int max = 1<<31;//int能表示的最小负数41 42 if(n == 1)43 {44 int num = ~(1<<31);45 for(i = 0;i < len;i++)46 {47 if(max < p[i])48 max = p[i];49 }50 }51 else52 {53 for(i = 0;i < len;i++)54 {55 if( p[i]< func(p,len,n-1))56 {57 if(max < p[i])58 max = p[i];59 }60 }61 }62 return max;63 }64 65 #include66 int main(void)67 {68 int arr[] = { 10,1,8,28,11,20,9};69 printf("%d\n",func(arr,sizeof(arr)/sizeof(int),5));//打印第n大的元素70 return 0;71 }