堆排序以及优先队列
2015-03-10 22:08
295 查看
算法导论中的堆排序。
主要的几个函数:
addnum(int newn)将一个newn元素添加到末尾,然后
将最大堆的第i个元素增加key
总结:算法很简单,但是实现的时候总是会出现一些小问题,解决的也很爽快,主要还是不够细心,没有在草稿纸上先画一下。
有时候感觉,算法都贴出来有点傻X,这么简单还贴。这是一种小小成就感在内心蒸腾~(-ิo-ิ)
主要的几个函数:
三个宏用来表示取父节点和左右子节点,算法导论讲的很详细实现很简单 #define PARENT(i)(i/2) #define LEFT(i)(2*i) #define RIGHT(i)(2*i+1) class Numbersort { public: Numbersort() { arry=NULL; nmber=0; } ~Numbersort() { if (arry!=NULL) { delete[]arry; } } int copynumber(int *p,int n);//给arry赋值 void putout();///输出数组 void sortnumber();///顺序排序,检验排序的正确性,堆排序中不用 void max_heapify(int heap_size,int i);//对长度为heap_size的堆的节点进行最大堆排序,以维护当前节点以及子节点的最大堆性质 void build_max_heap();//调用max_heapify构建最大堆 void stack_sort();//对build_max_heap()构建好的最大堆进行排序 void increase_key(int i,int key);//将当前借点i的key增加key(不是增加到key) void addnum(int newn);//增加newn到最大堆中 private: int *arry; int nmber; int size_down; };
函数int copynumber(int *p,int n)、void putout()和sortnumber()没啥好说的。
void Numbersort::max_heapify(int heap_size,int i) { int l=LEFT(i); int r=RIGHT(i); int largest=0; //堆排序的顺序比在数组中的位置大1,所以排序的顺序都要减去1 if (l<=heap_size&&arry[l-1]>arry[i-1]) { largest=l; } else largest=i; if (r<=heap_size&&arry[r-1]>arry[largest-1]) { largest=r; } if (largest !=i) { int temp=arry[largest-1]; arry[largest-1]=arry[i-1]; arry[i-1]=temp; max_heapify(heap_size,largest);//递归调用以保证父节点后的子节点是最大堆 } }
void Numbersort::build_max_heap() { int heap_size=nmber; int half_size=heap_size/2;//最大堆中的去掉叶节点的节点数 for (int i=half_size;i>0;i--) { max_heapify(nmber,i);//对每个父节点逐次调用最大堆 } }
void Numbersort::stack_sort() { for (int i=size_down;i>1;i--) { int temp=arry[0]; int temp2=arry[i-1]; arry[i-1]=arry[0]; arry[0]=temp2;//将最大的arry[0]与还未排序的最后一个交换,则最后一个就排好了数 size_down--;//sizedown减1后,已经排序好的数就不再参与最大堆排序。 max_heapify(size_down,1); putout(); } }
addnum(int newn)将一个newn元素添加到末尾,然后
void Numbersort::addnum(int newn) { int *p=new int [++nmber]; for (int i=0;i<nmber-1;i++) { p[i]=arry[i]; } if (arry!=NULL) { delete arry; arry=new int[nmber]; for (int i=0;i<nmber-1;i++) { arry[i]=p[i]; } delete p; } arry[nmber-1]=0;//将最后一个元素置为0,然后调用increase_key increase_key(nmber,newn); }
将最大堆的第i个元素增加key
void Numbersort::increase_key(int i,int key) { arry[i-1]+=key; while(i>1&&arry[PARENT(i)-1]<arry[i-1]) {//如果父节点比子节点小,则交换数,再对父节点进行判断,递归父节点的父节点是否符合。 int temp=arry[PARENT(i)-1]; arry[PARENT(i)-1]=arry[i-1]; arry[i-1]=temp; i=PARENT(i); } }
总结:算法很简单,但是实现的时候总是会出现一些小问题,解决的也很爽快,主要还是不够细心,没有在草稿纸上先画一下。
有时候感觉,算法都贴出来有点傻X,这么简单还贴。这是一种小小成就感在内心蒸腾~(-ิo-ิ)
相关文章推荐
- hdu1058 优先队列与map判重、 补充手动堆排序做法、
- hdu diy Developing School's Contest 2012-6 by SYU 优先队列排序问题
- 优先队列的排序写法
- 小白进阶之优先队列排序
- 堆排序应用之优先队列的实现
- Dijkstra单源最短路径算法; 优先队列+静态数组邻接表; STL优先队列还是没想明白排序原则;
- 【原+转】STL之优先队列的cmp函数和sort以及qsort函数的cmp
- 优先队列的结构体排序-重载运算
- HDU 4883 TIANKENG’s restaurant(排序或优先队列模拟)——BestCoder Round #2
- JAVA拾遗 - 优先队列的探讨以及其在KNN算法中的应用
- hdu 4006 输入新数后输出第k大的数 set以及优先队列2中做法
- 杭电 acm 幸福列车 (优先队列 以及优先队列中的优先项如何排列)
- 优先队列排序:先偶后奇
- 排序算法(四):优先队列、二叉堆以及堆排序
- 优先队列自动排序
- hdu1242 优先队列 以及非优先队列2中做法
- 用STL优先队列对字符串排序
- 优先队列----解决排序问题
- HDU 1678 Shopaholic(优先队列 + 排序 + 英文-我想哭)
- Day50、标准模板库、向量、迭代器、查找和排序、双端队列、列表、堆栈、队列和优先队列、映射、多重映射、集合、多重集合