您的位置:首页 > 编程语言 > C语言/C++

【排序算法】-堆排序

2016-07-07 20:32 435 查看
只实现了最大堆,最小堆同理;没有设置模板接口创建最小堆,之后改进。环境:VS2010 C++ Win10 64位。

template <typename Type>
class Heap
{
public:
void sort(vector <Type> &array);
void buildHeap(vector <Type>&array);
Heap() :heapSize(0){}
private:
int heapSize;
void keepHeap(vector <Type>& array, int element);
int left(int element){ return element * 2+1; }
int right(int element){ return (element+1) * 2 ; }
void  swap(vector <Type>& array, int n1, int n2);
};
template<typename Type>
void  Heap<Type> ::keepHeap(vector <Type>& array, int element)
{//维护最大堆性质
int l = left(element), r = right(element);
int largest = 0;
if (l < heapSize && array.at(l) > array.at(element))
largest = l;
else
largest = element;
if (r < heapSize && array.at(r) > array.at(largest))
largest = r;

if (largest != element)
{
swap(array, element, largest);
keepHeap(array, largest);
}
}

template<typename Type>
void Heap<Type>::buildHeap(vector <Type>&array)
{
heapSize = array.size();
for (int i = array.size() / 2-1 ; i >= 0 ; --i)
{
keepHeap(array, i);
}
}
template<typename Type>
void Heap<Type> ::sort(vector <Type>&array)
{
buildHeap(array);
for (int i = array.size() - 1; i >0; --i)
{
swap(array, 0, i);
heapSize--;
keepHeap(array, 0);
}
}
template<typename Type>
void Heap<Type>::swap(vector <Type>& array, int n1, int n2)
{
Type tmp = array[n1];
array[n1] = array[n2];
array[n2] = tmp;
}


算法特点归纳总结:

算法实现较为复杂,维护堆性质部分,使用了递归的算法,程序开销较大。算法平均复杂度和最坏情况为O(nlog(n)),最好情况为O(n),属于In-place 操作。空间开销不大。算法稳定。但是由于维护堆函数复杂,实际使用中时间开销并不理想。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息