堆排序练习(证明)
2013-09-16 23:14
127 查看
堆排序练习(证明)
关于堆排序的具体介绍和C代码实现见该链接。算导关于堆排序的练习主要是一些证明,可以帮助理解堆的特征。部分练习是图示过程,这些练习认真用笔过一次会很有收获。
1.在高度为h的堆中,最多和最少的元素个数是多少?
最多:底层全满;1 + 2^1 + 2^2 + ...... + 2^h,等比数列求和得2^(h+1) - 1
最少:底层只有一个节点;1 + 2^1 + 2^2 + ...... + 2^(h-1) + 1,等比数列求和得2^h - 1 + 1 = 2^h
2.证明:含n个元素的堆的高度为floor(lgn)
假设n个元素的堆的高度为h。由上题得2^h <= n <= 2^(h+1) - 1,因此h <= lgn < h+1。
根据floor 和 ceiling 函数的性质 View Code
void min_heapify(int A[], int length, int i){
int l = 2 * i;
int r = 2 * i + 1;
int smallest;
if(l <= length && A[l] < A[i])
smallest = l;
else
smallest = i;
if(r <= length && A[r] < A[smallest])
smallest = r;
if(smallest != i){
int temp = A[smallest];
A[smallest] = A[i];
A[i] = temp;
min_heapify(A, length, smallest);
}
}
6.将max_heapify()函数的递归调用改为迭代结构,使效率提高。
View Code
void max_heapify(int A[], int length, int i){
int l, r;
int largest, temp;
while(i <= length){
l = 2 * i;
r = 2 * i + 1;
if(l <= length && A[l] > A[i])
largest = l;
else
largest = i;
if(r <= length && A[r] > A[largest])
largest = r;
if(largest != i){
temp = A[largest];
A[largest] = A[i];
A[i] = temp;
i = largest;
}
else
break;
}
}
相关文章推荐
- 《算法导论》第六章----堆排序练习(证明)(完整版)
- 堆排序中建堆过程的时间复杂度O(n)的证明
- 堆排序练习(Heap Sort)
- Scala练习-堆排序
- [算法练习]堆排序的C语言实现
- 堆排序的练习
- 编程练习:堆排序
- CPU接口练习 (仅以此程序证明 某个同学真的有毒!有毒!!!)
- 数据结构练习——堆排序
- 排序(快速排序和堆排序)练习
- C++练习之 证明哥德巴赫猜想
- 【作业存档】堆排序和插入排序的练习
- HDU 1040(As Easy As A+B) 堆排序练习
- 练习——堆排序
- Java排序算法--建立堆和堆排序(练习)
- C++编程练习(13)----“排序算法 之 堆排序“
- [每日练习]堆排序
- 一个证明了返回值与重载无关的小练习
- [置顶] 课后练习8.3证明
- C++编程练习(13)----“排序算法 之 堆排序“