数据结构中的堆和操作系统中的堆、堆栈(栈)是没有关系的,大家不要像我一样有误解。
数据结构中的堆分两种:大(顶)堆和小(顶)堆,简单来说就是
〇 。
O O O O
。 。 。 。 (大堆) 〇 〇 〇 〇(小堆)这个意思。
一般用二叉树来描述这种数据结构,存储可以用数组。
下面是排序思路:
(图):
C++代码:
- #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;
- }