寻找第二小的元素:
如果用堆排序的方法,我们建立一个堆后只需要O(n),比较根节点的左儿子和右儿子的大小就可以得到第二小的节点了。而且BuildHeap的代价只有O(n)。
1 #include<iostream> 2 3 using namespace std; 4 5 #define Left(i) i*2+1 6 #define Right(i) i*2+2 7 8 int size = 10; 9 10 void Exchange(int &a, int &b) 11 { 12 int c = a; 13 a = b; 14 b = c; 15 } 16 17 void MaxHeap(int a[], int i) 18 { 19 int l = Left(i); 20 int r = Right(i); 21 int largest = i; 22 if (l < size&&a[l] < a[largest]) 23 largest = l; 24 if (r < size&&a[r] < a[largest]) 25 largest = r; 26 if (largest != i) 27 { 28 Exchange(a[largest], a[i]); 29 MaxHeap(a, largest); 30 } 31 } 32 33 void BuildHeap(int a[]) 34 { 35 for (int i = (size - 1) / 2; i >= 0; i--) 36 { 37 MaxHeap(a, i); 38 } 39 } 40 41 int main() 42 { 43 int a[] = { 16, 4, 10, 14, 14, 9, 3, 2, 8, 1 }; 44 BuildHeap(a); 45 for (int i = 0; i < 10; i++) 46 cout << a[i] << " "; 47 if (a[Left(0)] < a[Right(0)]) 48 cout << endl << a[Left(0)] << endl; 49 else 50 cout << endl<< a[Right(0)] << endl; 51 }
但是这种做法并不符合题目的要求,体现不出题目中对n+ceil(lgn)-2的阐述,所以我在实现一下题目的思想。