网络上流传的版本是错的,还有那么多人转载,真的是醉了
代码的思路是比较a数组,用b数据记录下标,故答案为(a[b[k1]]>a[b[k2]])
1 #include<bits/stdc++.h> 2 //重新决出k号位置,v为已输出值 3 void pk(int* a, int* b, int n, int k, int v) 4 { 5 int k1 = k*2 + 1; 6 int k2 = k1 + 1; 7 8 if(k1>=n || k2>=n){ 9 b[k] = -1; 10 return; 11 } 12 13 if(b[k1]==v) 14 pk(a,b,n,k1,v); 15 else 16 pk(a,b,n,k2,v); 17 18 //重新比较 19 if(b[k1]<0){ 20 if(b[k2]>=0) 21 b[k] = b[k2]; 22 else 23 b[k] = -1; 24 return; 25 } 26 27 if(b[k2]<0){ 28 if(b[k1]>=0) 29 b[k] = b[k1]; 30 else 31 b[k] = -1; 32 return; 33 } 34 if(a[b[k1]]>a[b[k2]]) 35 b[k] = b[k1]; 36 else 37 b[k] = b[k2]; 38 } 39 40 //对a中数据,输出最大,次大元素位置和值 41 void f(int* a, int len) 42 { 43 int n = 1; 44 while(n<len) n *= 2; 45 46 int* b = (int*)malloc(sizeof(int*) * (2*n-1)); 47 int i; 48 for(i=0; i<n; i++){ 49 if(i<len) 50 b[n-1+i] = i; 51 else 52 b[n-1+i] = -1; 53 } 54 55 //从最后一个向前处理 56 for(i=2*n-1-1; i>0; i-=2){ 57 if(b[i]<0){ 58 if(b[i-1]>=0) 59 b[(i-1)/2] = b[i-1]; 60 else 61 b[(i-1)/2] = -1; 62 } 63 else{ 64 if(a[b[i]]>a[b[i-1]]) 65 b[(i-1)/2] = b[i]; 66 else 67 b[(i-1)/2] = b[i-1]; 68 } 69 } 70 71 //输出树根 72 printf("%d : %d ", b[0], a[b[0]]); 73 74 //值等于根元素的需要重新pk 75 pk(a,b,2*n-1,0,b[0]); 76 77 //再次输出树根 78 printf("%d : %d ", b[0], a[b[0]]); 79 80 free(b); 81 } 82 83 84 int main() 85 { 86 int a[] = {54,55,18,16,122,17,30,9,58}; 87 f(a,9); 88 }