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 else
28 {
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 else
52 {
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 #include <stdio.h>
66 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 }