|
如果有错,希望能指出,谢谢。
 /**//*
堆排序。
*/
#include <iostream>

using namespace std;

 /**//*交换元素*/
template<typename _Ty>
inline void Swap(_Ty& _f,_Ty& _s)
  {
_Ty _t=_f;
_f=_s;_s=_t;
}
 /**//*调整堆*/
template<typename _Ty>
void HeapAdjust(_Ty* _arr,int _beg,int _end)
  {//_beg _end 第_beg个元素到第_end个元素 由1开始
for(int i=_beg*2;i<=_end;i*=2)
 {
//索引由1开始 使用时-1
if(i+1<=_end&&_arr[i-1]<_arr[i])++i;//左右结点元素相比较
if(_arr[i-1]>_arr[i/2-1]) //大于父亲结点则交换
Swap(_arr[i-1],_arr[i/2-1]);
else
return;
}
}

 /**//*堆排序*/
template<typename _Ty>
void HeapSort(_Ty* _arr,int _size)
  {
//将数组调整成堆
for(int i=_size/2;i>0;--i)
HeapAdjust(_arr,i,_size);
//取堆顶和最后一个元素交换
for(int j=_size;j>1;--j)
 {
Swap(_arr[0],_arr[j-1]);
HeapAdjust(_arr,1,j-1);
}
}

 /**//*打印数组*/
template<typename _Ty>
void OutArr(_Ty* _arr,int _size,ostream& _Os=cout)
  {
for(int i=0;i<_size;++i)
_Os<<_arr[i]<<" ";
_Os<<endl;
}

int main()
  {
int arr[100];
for(int i=0;i<100;arr[i++]=rand()%100);
OutArr(arr,100);
cout<<endl;
HeapSort(arr,100);
OutArr(arr,100);
}
|