您的位置:首页 > 其它

堆排序 图解 (网上摘抄)(方便查询)

2016-06-18 17:52 323 查看
数据结构中的堆和操作系统中的堆、堆栈(栈)是没有关系的,大家不要像我一样有误解。

数据结构中的堆分两种:大(顶)堆和小(顶)堆,简单来说就是

              〇                                                        。

      O                 O                                    O              O    

。         。   。         。    (大堆) 〇         〇    〇         〇(小堆)这个意思。

一般用二叉树来描述这种数据结构,存储可以用数组。

下面是排序思路:

(图):



C++代码:

[cpp] view
plaincopy

#include <iostream>  

#include <algorithm>  

  

using std::cout;  

using std::cin;  

using std::endl;  

template<class T>  

class Out{  

public:  

    void operator()(T o)  

    {  

        cout<<o<<'\t';  

    }  

};  

template<class T>  

void Swap(T& a,T&b)  

{  

    T t=a;  

    a=b;  

    b=t;  

}  

inline int Rt(int idx)  

{  

    return (idx<<1)+2;  

}  

inline int Lt(int idx)  

{  

    return (idx<<1)+1;  

}  

  

template<class T>  

void HeapBuild(T* A,int idx,int size)  

{  

    int child;  

    for(;idx<=size/2;idx=child)  

    {  

        child=Lt(idx);  

        if (child<size&&A[child]>A[idx])  

        {  

            Swap(A[idx],A[child]);  

        }  

        child=Rt(idx);  

        if (child<size&&A[child]>A[idx])  

        {  

            Swap(A[idx],A[child]);  

        }  

    }  

}  

template<class T>  

void HeapSort(T* A,int size)  

{  

    for (int i=size/2;i>=0;i--)  

    {  

        HeapBuild(A,i,size);  

    }  

    for (int i=size-1;i>=0;i--)  

    {  

        Swap(A[0],A[i]);  

        HeapBuild(A,0,i);  

    }  

}  

int main()  

{  

    int size=0;  

    cout<<"enter elements count num:"<<endl;  

    cin>>size;  

    int* elems = new int[size];  

    cout<<"Input all elements to be sort:"<<endl;  

    for(int i=0;i<size;cin>>elems[i++]);  

    HeapSort(elems,size);  

    std::for_each(elems,elems+size,Out<int>());  

    delete []elems;  

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