No.126_c++_实现堆排序
Posted 二狗Code俱乐部
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了No.126_c++_实现堆排序相关的知识,希望对你有一定的参考价值。
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++_实现堆排序的主要内容,如果未能解决你的问题,请参考以下文章