算法导论例题及课后习题代码实现——第六章
2012-06-29 22:33
531 查看
例题1,堆排序,在该堆排序中Max_Heapify函数分别用递归和循环实现
#include<iostream> using namespace std; #define Left(i) i*2+1 #define Right(i) i*2+2 #define Parent(i) (i-1)/2 void Max_Heapify(int a[],int length,int i) { int left,right; left=Left(i); right=Right(i); int num=i; if(left<length&&a[left]>a[i]) { num=left; } //此处逻辑判断出错,开始为else if,发现不能正确排序,改为else之后正确 if(right<length&&a[right]>a[num]) { num=right; } if(num!=i) { int temp; temp=a[i]; a[i]=a[num]; a[num]=temp; Max_Heapify(a,length,num); } } //此处添加利用循环方式代替递归Max_Heapify的函数,该函数可以替代Max_Heapify //在某些情况下能取得更好 的效果 void Max_Heapify1(int a[],int length,int i) { int left,right,num=i,largest=i; left=Left(i); right=Right(i); while(1) { if(a[left]>a[num]&&left<length) { largest=left; } //此处逻辑判断出错,开始为else if,发现不能正确排序,改为else之后正确 if(a[right]>a[largest]&&right<length) { largest=right; } if(num!=largest) { int temp; temp=a[num]; a[num]=a[largest]; a[largest]=temp; num=largest; left=Left(num); right=Right(num); } else { break; } } } void Build_Max_Heap(int a[],int length ) { int i; for(i=(length-1)/2;i>=0;i--) { Max_Heapify1(a,length,i); } } void Heap_Sort(int a[],int length) { Build_Max_Heap(a,length); int i; int temp; for(i=length-1;i>=1;i--) { temp=a[i]; a[i]=a[0]; a[0]=temp; length-=1; Max_Heapify1(a,length,0); } } int main() { int a[20]={2,5,3,15,4,19,4,8,9,7,11,10,12,14,1,9,20,17,15,16}; int b[10]={16,4,10,14,7,9,3,2,8,1}; Heap_Sort(b,10); int i; for(i=0;i<10;i++) { cout<<b[i]<<" "; } return 0; }
相关文章推荐
- 《算法导论》第二章----插入排序(伪代码实现、课后习题(递归版本、二分查找策略版本))
- 算法导论第二章课后习题代码实现
- 《算法导论》第六章----优先级队列(代码实现+部分练习)
- 《算法导论》第六章----优先级队列(代码实现+部分练习)
- 算法导论三习题2.1-4代码实现
- 算法导论习题6.2代码实现
- 算法导论第十三章习题13-3——AVL树(高度平衡树)C++代码详细实现
- 算法导论课后习题解析 第六章
- 算法导论第十五章习题15.1-1c++代码实现
- 算法导论课后习题解析 第六章
- 算法导论第十一章11.4例题——开放寻址法代码实现
- 算法导论第十五章习题15.4-4c++代码实现
- 周志华《机器学习》课后习题解答系列(五):Ch4.4 - 编程实现CART算法与剪枝操作
- 算法导论课后习题解析 第四章 下
- C++Primer 中文版 第五版 第六章课后习题答案
- 算法导论10.1-2习题解答(用一个数组实现两个栈)
- 算法导论Java实现-删除堆中元素HeapDelete(习题6.5-7)
- 《C++ Primer》第五版课后习题解答_第六章(1)(01-07)
- c++primer第六章课后习题
- C和指针课后习题(第六章)