c/c++实现堆排序
2017-08-02 21:18
169 查看
/// /// @file heapSort.cc /// @author guoleida(496919313@qq.com) /// @date 2017-08-02 14:57:43 /// #include <string> #include <iostream> using std::cout; using std::endl; using std::string; template <typename T > class HeapSort { public: HeapSort(T *arr,int size); void heapAdjust(int k,int len); void sort(); void buildMaxHeap(); private: T *_arr; int _size; }; template<typename T> HeapSort<T>::HeapSort(T *arr,int size)//构造函数 : _arr(arr) , _size(size) {} template<typename T> void HeapSort<T>::sort() { buildMaxHeap();//初始建堆 T tmp; for(int i=_size;i>1;i--)//n-1趟交换和建堆过程 { tmp = _arr[i];//将堆底元素和堆顶元素交换,并输出堆顶元素 _arr[i] = _arr[1]; _arr[1] = tmp; heapAdjust(1,i-1); } } template<typename T> void HeapSort<T>::buildMaxHeap() { for(int i=_size/2;i>0;i--) heapAdjust(i,_size); } template<typename T> void HeapSort<T>::heapAdjust(int k,int len) //函数heapadjust将元素k向下进行调整 { _arr[0] = _arr[k]; for(int i=2*k; i<=len; i*=2)//沿着key较大的子节点向下筛选 { if(i < len && _arr[i] < _arr[i+1]) i++; //取key较大的子节点的下标 if(_arr[0] >= _arr[i]) break;//筛选结束 else { _arr[k] = _arr[i];//将_arr[i]调整到双亲节点上 k=i;//修改k值,一边继续向下筛选 } } _arr[k] = _arr[0]; } int main() { int a[]={0,7,5,2,9,8,1,2,5,8,7};//第一个位置不存放实际数据 for(int i=1;i<11;i++) cout << a[i] <<" "; cout <<endl; HeapSort<int> hp(a,10); hp.sort(); for(int i=1;i<11;i++) cout << a[i] <<" "; cout <<endl; }
相关文章推荐
- 堆排序及C++实现
- 算法学习 - 堆排序 ( HeapSort ) C++实现
- 堆排序 c/c++实现
- 堆排序的实现 C++
- 堆排序(C++实现)
- c++实现堆排序及运行实例结果
- 堆排序(C++模版技术实现)
- 算法代码实现之堆排序,C/C++实现
- 堆排序-c++实现,节点变动则递归子树调整状态
- C++实现堆、最大堆、最小堆 -- 堆排序插入删除操作
- c++实现二叉堆及堆排序
- c++实现堆排序及运行实例结果
- 堆排序(C++实现)
- 插入排序、冒泡排序、选择排序、希尔排序、高速排序、归并排序、堆排序和LST基数排序——C++实现
- 堆排序(C++实现)
- 【算法】排序 (一):插入排序&希尔排序&选择排序&堆排序(C++实现)
- 堆的操作和堆排序-最小堆实现递减排序-C++
- C++实现堆排序并记录编程中遇到的一个bug(不要对无符号整形数在--的循环中采用>=0作为结束条件)
- 加速堆排序的C++实现
- c++实现堆排序及运行实例结果