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

[C++模板]堆排序

2016-11-21 23:21 471 查看
    今天,我们一起用C++实现堆排序,目的是熟练C++的语法,具体代码如下。
Data.h具体内容如下:

[cpp] view
plain copy


 





template<typename Type> class Element{  

public:  

    Type GetKey(){  

        return key;  

    }  

  

    void SetKey(Type item){  

        key = item;  

    }  

  

public:  

    Element<Type>& operator =(Element<Type> copy){  

        key = copy.key;  

        return *this;  

    }  

  

    bool operator ==(Element<Type> item){  

        return this->key == item.key;  

    }  

  

    bool operator !=(Element<Type> item){  

        return this->key != item.key;  

    }  

  

    bool operator <(Element<Type> item){  

        return this->key < item.key;  

    }  

  

    bool operator >(Element<Type> item){  

        return this->key > item.key;  

    }  

  

    bool operator >=(Element<Type> item){  

        return this->key >= item.key;  

    }  

  

    bool operator <=(Element<Type> item){  

        return this->key <= item.key;  

    }  

  

  

private:  

    Type key;  

};  

  

template<typename Type> class Sort;  

template<typename Type> class DataList{  

public:  

    friend class Sort < Type > ;  

    DataList(int size = m_nDefaultSize) : m_nMaxSize(size), m_ncurrentsize(0){  

        m_pvector = new Element<Type>[size];  

    }  

  

    DataList(Type *data, int size);  

  

    bool Insert(Type item);  

    ~DataList(){  

        delete[] m_pvector;  

    }  

  

    int Size(){  

        return this->m_ncurrentsize;  

    }  

    void Swap(Element<Type> &left, Element<Type> &right){  

        Element<Type> temp = left;  

        left = right;  

        right = temp;  

    }  

  

    void Print();  

private:  

    static const int m_nDefaultSize = 10;  

    Element<Type> *m_pvector;  

    const int m_nMaxSize;  

    int m_ncurrentsize;  

};  

  

template<typename Type> DataList<Type>::DataList(Type *data, int size)  

    : m_nMaxSize(size > m_nDefaultSize ? size : m_nDefaultSize), m_ncurrentsize(0){  

    this->m_pvector = new Element<Type>[size];  

    for (int i = 0; i < size; i++){  

        this->m_pvector[i].SetKey(data[i]);  

    }  

    this->m_ncurrentsize += size;  

  

}  

  

template<typename Type> bool DataList<Type>::Insert(Type item){  

    if (this->m_ncurrentsize == this->m_nMaxSize){  

        cerr << "The list is full!" << endl;  

        return 0;  

    }  

    this->m_pvector[this->m_ncurrentsize++].SetKey(item);  

}  

  

template<typename Type> void DataList<Type>::Print(){  

    cout << "The list is:";  

    for (int i = 0; i < this->m_ncurrentsize; i++){  

        cout << " " << this->m_pvector[i].GetKey();  

    }  

}  

LinkQueue.h具体内容如下:

[cpp] view
plain copy


 





#include "QueueNode.h"  

  

template<typename Type> class LinkQueue{  

public:  

    LinkQueue() :m_prear(NULL), m_pfront(NULL){}  

    ~LinkQueue(){  

        MakeEmpty();  

    }  

    void Append(const Type item);  

    Type Delete();  

    Type GetFront();  

    void MakeEmpty();  

    bool IsEmpty() const{  

        return m_pfront == NULL;  

    }  

    void Print();  

  

private:  

    QueueNode<Type> *m_prear, *m_pfront;  

};  

  

template<typename Type> void LinkQueue<Type>::MakeEmpty(){  

    QueueNode<Type> *pdel;  

    while (m_pfront){  

        pdel = m_pfront;  

        m_pfront = m_pfront->m_pnext;  

        delete pdel;  

    }  

}  

  

template<typename Type> void LinkQueue<Type>::Append(const Type item){  

    if (m_pfront == NULL){  

        m_pfront = m_prear = new QueueNode<Type>(item);  

    }  

    else{  

        m_prear = m_prear->m_pnext = new QueueNode<Type>(item);  

    }  

}  

  

template<typename Type> Type LinkQueue<Type>::Delete(){  

    if (IsEmpty()){  

        cout << "There is no element!" << endl;  

        exit(1);  

    }  

    QueueNode<Type> *pdel = m_pfront;  

    Type temp = m_pfront->m_data;  

    m_pfront = m_pfront->m_pnext;  

    delete pdel;  

    return temp;  

}  

  

template<typename Type> Type LinkQueue<Type>::GetFront(){  

    if (IsEmpty()){  

        cout << "There is no element!" << endl;  

        exit(1);  

    }  

    return m_pfront->m_data;  

}  

  

template<typename Type> void LinkQueue<Type>::Print(){  

    QueueNode<Type> *pmove = m_pfront;  

    cout << "front";  

    while (pmove){  

        cout << "--->" << pmove->m_data;  

        pmove = pmove->m_pnext;  

    }  

    cout << "--->rear" << endl << endl << endl;  

}  

QueueNode.h具体内容如下:

[cpp] view
plain copy


 





template<typename Type> class LinkQueue;  

  

template<typename Type>  

class QueueNode  

{  

private:  

    friend class LinkQueue < Type > ;  

    QueueNode(const Type item, QueueNode<Type> *next = NULL)  

        :m_data(item), m_pnext(next){}  

private:  

    Type m_data;  

    QueueNode<Type> *m_pnext;  

};  

Sort.h具体内容如下:

[cpp] view
plain copy


 





#include "Data.h"  

#include "LinkQueue.h"  

  

template<typename Type> class Sort{  

public:   

    void HeapSort(DataList<Type> &list);  

private:      

    void HeapAdjust(DataList<Type> &list, const int start, const int end);  

};  

template<typename Type>  

void Sort<Type>::HeapAdjust(DataList<Type> &list, const int start, const int end){  

    int current = start, child = 2 * current + 1;  

    Element<Type> temp = list.m_pvector[start];  

    while (child <= end){  

        if (child < end && list.m_pvector[child] < list.m_pvector[child + 1]){  

            child++;  

        }  

        if (temp >= list.m_pvector[child]){  

            break;  

        }  

        else {  

            list.m_pvector[current] = list.m_pvector[child];  

            current = child;  

            child = 2 * current + 1;  

        }  

    }  

    list.m_pvector[current] = temp;  

}  

  

template<typename Type>  

void Sort<Type>::HeapSort(DataList<Type> &list){  

    for (int i = (list.m_ncurrentsize - 2) / 2; i >= 0; i--){  

        HeapAdjust(list, i, list.m_ncurrentsize - 1);  

    }  

  

    for (int i = list.m_ncurrentsize - 1; i >= 1; i--){  

        list.Swap(list.m_pvector[0], list.m_pvector[i]);  

        HeapAdjust(list, 0, i - 1);  

    }  

}  

main.cpp具体内容如下:

[cpp] view
plain copy


 





#include <iostream>  

using namespace std;  

#include "Sort.h"  

int main()  

{  

    int init[15] = { 1, 3, 5, 7, 4, 2, 8, 0, 6, 9, 29, 13, 25, 11, 32 };  

    DataList<int> data(init, 15);  

    Sort<int> sort;  

    data.Print();  

    cout << endl << endl << endl;   

    sort.HeapSort(data);      

    data.Print();  

    cin.get();  

    return 0;  

}  

运行效果如图1所示:

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