您的位置:首页 > 其它

泛型算法之堆排

2015-09-13 13:11 176 查看
实现了堆排的泛型算法,测试用例覆盖了STL的容器,C++内置数组,int,char,double类型元素。


#include <iostream>
#include <vector>
using namespace std;

template<typename RandomAccessIterator>        //下溯
void HeapAdjust(RandomAccessIterator begin, RandomAccessIterator end, RandomAccessIterator start)
{
int len = end - begin;
end--;
int s = 2 * (start - begin + 1);
auto parent = *start;
auto child = begin;
for (; s<=len; s = 2*(start - begin + 1) )
{
child = begin + s-1;
if (child < end&&*child < *(child + 1))
++child;
if (parent >= *child)
break;
*start = *child;
start = child;
}
*start = parent;
}

template<typename RandomAccessIterator>
void HeapSort(RandomAccessIterator begin, RandomAccessIterator end)
{
int len = end - begin;
int i;
for (i = len / 2; i > 0; --i)                 //上溯
HeapAdjust(begin, end, begin+i-1);        //构造大顶堆

for (i = len; i > 1; --i)
{
iter_swap(begin, begin + i - 1);
HeapAdjust(begin, begin+i-1, begin);        //构造大顶堆
}
}

int main(int argc, char ** argv)
{
vector<int> a = { 9, 4, 2, 7, 5, 6, 0, 1, 3, 10, 14, 8, 11, 15, 18, 19, 17, 16, 12, 13 };
double b[20] = { 0.0, 4.4, 2.2, 7.7, 5.5, 6.6, 9.9, 1.1, 3.3, 10, 14, 8, 11, 15, 18, 19, 17, 16, 12, 13 };
char c[20] = { 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'q', 'w', 'e', 'r' };
HeapSort(a.begin(), a.end());
for (auto i = a.begin(); i != a.end(); ++i)
cout << *i <<" ";
cout << endl;

HeapSort(b,b+20);
for (auto i = 0; i <20; ++i)
cout << b[i] << " ";
cout << endl;

HeapSort(c, c + 20);
for (auto i = 0; i <20; ++i)
cout << c[i] << " ";
cout << endl;
return 0;
}


测试结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: