您的位置:首页 > 其它

堆排序

2016-03-29 15:13 344 查看
堆排序:

1.建大堆;

2.堆顶元素和堆最后一个元素交换;

3.继续建大堆(从上往下调整);

4.再取堆顶元素与堆尾倒数第二个元素交换;

5.升序输出

代码:

#pragma once

#include<iostream>
#include<vector>
//using namespace std;  //尽量不要让 using出现在头文件中

template<class T>
class Heap
{
public:
//构造
Heap();

//建大堆
Heap(const T* a,size_t size);

//堆排序
void HeapSort();

//建堆副
void _Heap(const T* a,size_t size);

//虚向下调整 实向上走
void AdjustDown(int index,int num);

void AdjustUp(int index);

//打印
void Print();

private:
vector<T> MinHeap;
};

template<class T>
Heap<T>::Heap()
{}

template<class T>
Heap<T>::Heap(const T* a,size_t size)
{
_Heap(a,size);
}

template<class T>
void Heap<T>::_Heap(const T *a, size_t size)
{
for(int i = 0; i < size; i++)
{
MinHeap.push_back(a[i]);
}

//第一个非叶子结点开始
for(int i = (MinHeap.size()-2)/2; i >= 0; i--)
{
AdjustUp(i);
}
}

template<class T>
void Heap<T>::AdjustDown(int index,int num)
{
int child = 2*index+1;
int cout = num+1;
while(child < MinHeap.size()-cout)
{
if(child+1 <MinHeap.size()-cout && MinHeap[child] < MinHeap[child+1])
{
child++;
}

if(MinHeap[child] > MinHeap[(child-1)/2])
{
swap(MinHeap[child],MinHeap[(child-1)/2]);
index = child; //交换后的是不是打乱了顺序  继续
child = 2*index+1;//等效循环外的第一个条件
}
else
{
break;
}
}
}

template<class T>
void Heap<T>::AdjustUp(int index)
{
int child = index*2 + 1;
while(child < MinHeap.size())
{
if((child+1)< MinHeap.size() && MinHeap[child+1] > MinHeap[child])
{
child++;
}

if(MinHeap[child] > MinHeap[(child-1)/2])
{
swap(MinHeap[child],MinHeap[(child-1)/2]);
index = child;
child = 2*index+1;
}
else
{
break;
}
}
}

template<class T>
void Heap<T>::HeapSort()
{
for(int i = 0; i < MinHeap.size(); i++)
{
int num = MinHeap.size()-i-1;
swap(MinHeap[0],MinHeap[num]);
AdjustDown(0,i);
}
}

template<class T>
void Heap<T>::Print()
{
for(int i = 0; i < MinHeap.size();i++)
{
cout<<MinHeap[i]<<" ";
}
cout<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: