美文网首页
C++实现的一个堆排序算法

C++实现的一个堆排序算法

作者: IT孤独者 | 来源:发表于2016-12-29 18:44 被阅读0次

堆排序是一个比较重要的排序算法,这个排序算法并不是一个最好的排序算法,但是这个算法使用了一种思想,通过数据结构来实现特定的目的的方法。
堆排序的算法依赖堆这种数据结构。
我们使用C++实现这个算法,有两个目的,第一熟悉C++面向对象的设计原则,第二熟悉资源管理的方法。

此例子实现一个CInt类,这个主要是模仿现实的情况,我们可能会对一组对象进行排序,针对这个场景,我们也是使用了智能指针配合序列容器进行排序操作,另外,STL库里面有排序算法,我们可以直接使用之。

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

class CInt
{
public:
    CInt(int nNum) : m_nNum(nNum) {}
    ~CInt() { }
    CInt(const CInt & other) { m_nNum = other.m_nNum; }
    CInt & operator= (const CInt & other) 
    {
        m_nNum = other.m_nNum;
        return *this;
    }

    bool operator< (const CInt & other)
    {
        return m_nNum < other.m_nNum;
    }

    void SetNum(int nNum) { m_nNum = nNum; }
    int  GetNum() const { return m_nNum; }
private:
    int m_nNum;
};

typedef shared_ptr<CInt> CIntSPtr;

class CHeapSort
{
public:
    CHeapSort() {}
    ~CHeapSort() {}
private:
    CHeapSort(const CHeapSort & other);
    CHeapSort & operator= (const CHeapSort & other);

public:
    vector<CIntSPtr> Sort(const vector<CIntSPtr> & vecNum)
    {
        m_vecNum = vecNum;

        BuildHeap();
        Sort();

        return m_vecNum;
    }
private:
    void BuildHeap()
    {
        for (int i=m_vecNum.size()/2-1; i>=0; --i) {
            AdjustHeap(i, m_vecNum.size());
        }
    }

    void Sort()
    {
        for (int i=m_vecNum.size()-1; i>0; --i) {
            swap(m_vecNum[i], m_vecNum[0]);
            AdjustHeap(0, i);
        }
    }

    void AdjustHeap(size_t i, size_t HeapSize)
    {
        auto j = i;     
        auto left     = LEFT(i);
        auto right    = RIGHT(i);

        if (left  < HeapSize && *m_vecNum[j]<*m_vecNum[left])  j = left;
        if (right < HeapSize && *m_vecNum[j]<*m_vecNum[right]) j = right;

        if (j != i)
        {
            swap(m_vecNum[i], m_vecNum[j]);
            AdjustHeap(j, HeapSize);
        }
    }

    size_t LEFT(size_t i)
    {
        return 2 * i + 1;
    }

    size_t RIGHT(size_t i)
    {
        return 2 * i + 2;
    }

    size_t PARENT(size_t i)
    {
        return (i-1) / 2;
    }

private:
    vector<CIntSPtr> m_vecNum;
};

void OutPut(const CIntSPtr & a)
{
    cout << a->GetNum() << " ";
}

int main(int argc, char ** argv)
{
    const int LEN = 10;
    int a[LEN] = {0, 2, 7, 9, 8, 3, 4, 1, 5, 6};
    vector<CIntSPtr> vecNumber;

    for (int i=0; i<LEN; ++i) {
        vecNumber.push_back(CIntSPtr(new CInt(a[i])));
    }

    for_each(vecNumber.begin(), vecNumber.end(), OutPut);
    cout << endl;

    CHeapSort heap_sort;
    vecNumber = heap_sort.Sort(vecNumber);

    for_each(vecNumber.begin(), vecNumber.end(), OutPut);
    cout << endl;
    
    return 0;
}

相关文章

  • 常见排序算法

    希尔排序,快速排序,堆排序,2路归并算法的c++简单实现 在 里面写了一个随机数列生成,可以快速验证算法的正确性 ...

  • 排序

    八大排序算法 一、归并排序 递归及非递归的JAVA实现 二、快速排序 快排算法JAVA实现 三、堆排序 堆排序堆排...

  • Javascript和堆排序

    前言 这里以递归为例,参考自慕课网刘波波老师的C++版本实现 普通堆排序(实现了一个完整的堆) 普通的堆排序首先肯...

  • C++实现的一个堆排序算法

    堆排序是一个比较重要的排序算法,这个排序算法并不是一个最好的排序算法,但是这个算法使用了一种思想,通过数据结构来实...

  • python实现堆排序(HeapSort)

    python实现【堆排序】(HeapSort) 算法原理及介绍 堆排序(Heapsort)是指利用堆这种数据结构所...

  • iOS算法总结-堆排序

    iOS算法总结-堆排序 iOS算法总结-堆排序

  • 京东高级java现场三面,包含:算法、数据库、设计模式、java

    京东技术面试(一): 算法面试: 二叉树怎么实现的 知道哪些排序算法 快排怎么实现 堆排序怎么实现 一道算法题:两...

  • 三大排序算法

    归并排序[稳定的排序算法] 递归实现 非递归实现 快速排序[不稳定的排序算法] 堆排序[不稳定的排序算法]

  • C++ 经典算法集锦 二

    C++经典算法实现系列2 上回我们说道,牛逼的C++可以实现很多牛逼的算法。我们继续之前的记录。 Algorith...

  • 排序算法(六)堆排序

    排序算法(六 )堆排序 1.算法思路  堆排序(Heap-Sort)是一种基于二叉堆的排序算法。即将一个无序序列构...

网友评论

      本文标题:C++实现的一个堆排序算法

      本文链接:https://www.haomeiwen.com/subject/ewspvttx.html