C++排序(小堆排序)
2015-04-08 17:12
162 查看
#include<iostream> #include<string> using namespace std; template<class Type> class MinHeap { public: MinHeap(int sz=DefaultSize) { capacity = sz>DefaultSize?sz:DefaultSize; heap = new Type[capacity]; size = 0; } MinHeap(Type ar[], int n) { capacity = n>DefaultSize?n:DefaultSize; heap = new Type[capacity]; for(int i=0; i<n; ++i) { heap[i] = ar[i]; } size = n; int pos = n/2-1; while(pos >= 0) { SiftDown(pos,n-1); pos--; } } ~MinHeap() { delete []heap; heap = NULL; } void Show()const { for(int i=0; i<size; ++i) { cout<<heap[i]<<" "; } cout<<endl; } bool IsEmpty()const { return size == 0; } bool IsFull()const { return size >= capacity; } void MakeHeap() { size = 0; } Type ReMoveMin() { Type tmp = heap[0]; heap[0] = heap[size-1]; size--; SiftDown(0,size-1); return tmp; } void Sort() { Type *data = new Type[size]; int i = 0; while(!IsEmpty()) { data[i++] = ReMoveMin(); } size = i; for(i=0; i<size; ++i) { heap[i] = data[i]; } delete []data; data = NULL; } void Insert(const Type &x) { heap[size] = x; SiftUp(size); size++; } private: void SiftUp(int start) { int j = start; int i = (j-1)/2; Type tmp = heap[j]; while(j>0) { if(tmp > heap[i]) break; else { heap[j] = heap[i]; j = i; i = (j-1)/2; } } heap[j] = tmp; } void SiftDown(int start, int end) { int i = start; int j = 2*i+1; Type temp = heap[i]; while(j <= end) { if(j<end && heap[j] > heap[j+1]) j = j+1; if(temp < heap[j]) break; else { heap[i] = heap[j]; i = j; j = 2*i+1; } } heap[i] = temp; } private: enum{DefaultSize = 10}; Type *heap; int capacity; int size; };堆可以被看作是一个完全二叉树,小堆排序利用小根堆堆顶记录的关键字最小这一个特征,使得从当前无序区中选取最小关键字并进一步记录操作变的简单。
相关文章推荐
- 4-5 基础堆排序和Heapify(两个版本的基于堆的排序算法)
- 排序算法_3,堆排序
- 堆排序
- 堆排序Heap sort
- 堆排序( 内部排序 续 )
- 数据结构-中序遍历线索二叉树,堆排序
- 堆排序
- 堆排序的实现
- 堆排序(java)
- leetcode 628. Maximum Product of Three Numbers(C语言,堆排序,计算最大乘积)33
- 堆排序
- 排序详解:堆排序
- 堆排序,笨人脑筋真的转不动了,花了几个小时才看懂。。
- 堆和堆排序
- 选择排序与堆排序
- [置顶] 了解堆排序并用js实现
- 堆排序
- 堆排序的java实现
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 堆排序