No.126_c++_实现堆排序

Posted 二狗Code俱乐部

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了No.126_c++_实现堆排序相关的知识,希望对你有一定的参考价值。

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放

#include <iostream>using namespace std;
template <typename Type>class HeapSort{public: HeapSort(Type * arr,int size) :_data(arr) ,_size(size) { cout<<"HeapSort()"<<endl; }
~HeapSort() { cout<<"~HeapSort()"<<endl; }
void buildMaxHeap(){ cout<<"buildMaxHeap()"<<endl; for(int i=_size/2-1;i>=0;i--) { //堆下标为3 数组元素下标也为3 heapAdjust(i); } cout<<"build finish"<<endl; print(); }
void heapAdjust(int k){ //自下往上逐步调整为大根堆 cout<<"heapAdjust()"<<endl; int tmp=_data[k]; int i=2*k+1; while(i<_size) { //先找教大的child来比较 if(i+1<_size && _data[i]<_data[i+1]) { i++; } if(tmp>_data[i]) { break; //parent更大 不用交换了. }
_data[k]=_data[i]; k=i; //继续查找
i=2*k+1; } _data[k]=tmp; }
void sort(){ cout<<"sort()"<<endl; buildMaxHeap(); for(int i=_size-1;i>=0;--i) { swap(_data[0],_data[i]); --_size; heapAdjust(0); } }
void swap(Type & a,Type & b){ Type temp=a; a=b; b=temp; }
void print(){ for(int i=0;i<_size;i++){ cout<<_data[i]<<" "; } cout<<endl; }private: Type * _data; int _size;};


void test(){ int arr[]={11,13,4,9,1,7,18,2}; cout<<"Before sort:"<<endl; HeapSort<int> heap(arr,8); heap.print(); cout<<"After sort:"<<endl; clock_t start=clock(); heap.sort(); for(auto & n:arr) { cout<<n<<" "; } cout<<endl; clock_t end=clock(); cout<<"Total time:"<<end-start<<endl;}

int main(){ test(); return 0;}

.......................................................................................................................................

堆排序(Heap sort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以用到上一次的排序结果,所以不像其他一般的排序方法一样,每次都要进行n-1次的比较,复杂度为O(nlogn)。


几个基本概念:


完全二叉树:假设一个二叉树有n层,那么如果第1到n-1层的每个节点都达到最大的个数:2,且第n层的排列是从左往右依次排开的,那么就称其为完全二叉树


堆:本身就是一个完全二叉树,但是需要满足一定条件,当二叉树的每个节点都大于等于它的子节点的时候,称为大顶堆,当二叉树的每个节点都小于它的子节点的时候,称为小顶堆

.......................................................................................................................................


以上是关于No.126_c++_实现堆排序的主要内容,如果未能解决你的问题,请参考以下文章

十大排序算法总结(Python3实现)

『算法设计_伪代码』堆排序

堆排序C语言版本的

python 实现堆和堆排序

堆排序Java实现

算法导论第八章__实现计数排序