泛型算法之堆排

實現了堆排的泛型算法,測試用例覆蓋了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;
}

測試結果
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章