第六章:堆排序
来源:互联网 发布:在线美工平台 编辑:程序博客网 时间:2024/06/01 09:55
一:二叉堆的基本操作:
假设我们要实现的是一个最小堆:
1:插入操作
代码:
template<class Type>void binaryHeap<Type>::insert(const Type& val){ if(currentSize==array.size()-1) array.resize(array.size()*2); int hole=++currentSize; while(hole>1&&val<array[hole/2]){ array[hole]=array[hole/2]; hole/=2; } array[hole]=val;}
2:下滤操作:
template<class Type>void binaryHeap<Type>::percolateDown(int hole){ int child; Type tmp=array[hole]; while(hole*2<=currentSize){ child=hole*2; if(child!=currentSize&&array[child+1]<array[child]) child++; if(array[child]<tmp){ array[hole]=array[child]; hole=child; } else break; } array[hole]=tmp;}
3:删除最小值操作
//将堆中最小值删除,但不返回该最小值;template<class Type>void binaryHeap<Type>::deleteMin(){ if(isEmpty()) throw underflow_error("The heap is empty?!"); array[1]=array[currentSize--]; percolateDown(1);}//将堆中最小值删除,并且返回该最小值;template<class Type>void binaryHeap<Type>::deleteMin(Type& min){ if(isEmpty()) throw underflow_error("The heap is empty?!"); min=array[1]; array[1]=array[currentSize--]; percolateDown(1);}
二:堆排序
堆排序顾名思义是用二叉堆对一些列元素进行排序,二叉堆用的是最大堆。代码如下:
//下滤操作:template<class Comparable>void percDown(vector<Comparable>& a,int i,int n){ int Child; Comparable tmp; for(tmp=a[i];2*i+1<n;i=Child) { Child=2*i+1; if(Child!=n-1&&a[Child]<a[Child+1]) Child++; if(tmp<a[Child]) a[i]=a[Child]; else break; } a[i]=tmp;}template<class Comparable>void heapsort(vector<Comparable>& a){ for(int i=a.size()/2;i>=0;i--) percDown(a,i,a.size()); //建立一个最大堆 for(int j=a.size()-1;j>0;j--) { swap(a[0],a[j]); //删除一个最大值 percDown(a,0,j); }}
0 0
- 第六章:堆排序
- 第六章--堆排序
- 第六章 堆排序
- 第六章:堆排序
- 第六章 堆排序 C++
- 第六章 堆排序习题
- 第六章堆排序之“堆排序HEAPSORT”
- 算法导论: 第六章 堆排序算法
- 算法导论读书笔记 第六章 堆排序
- 算法导论第六章:堆排序
- 算法导论第六章 堆排序总结
- 算法导论第六章 堆排序
- 算法导论 第六章 堆排序
- 【算法导论】第六章之堆排序
- 算法导论第六章 堆排序
- 堆排序(算法导论第六章)
- [算法导论]第六章《堆排序》
- 算法导论第六章堆排序思考题
- 线性判别函数、判定面以及感知器
- android中selector在java代码中使用无效的解决方案
- apache日志轮询技术(cronolog and rotatelogs)小结
- Android小白的培训之路
- 如何将excel表格数据使用图形化工具workbench导入mysql数据库中
- 第六章:堆排序
- Easy-题目30:66. Plus One
- JavaScript学习笔记03
- 二叉树的遍历(递归)
- mysql 锁表解锁
- Web页面请求的历程(四)
- CentOS安装docker
- Easy-题目31:118. Pascal's Triangle
- json对象与json字符串的相互转换