|
如果有錯(cuò),希望能指出,謝謝。
 /**//*
堆排序。
*/
#include <iostream>

using namespace std;

 /**//*交換元素*/
template<typename _Ty>
inline void Swap(_Ty& _f,_Ty& _s)
  {
_Ty _t=_f;
_f=_s;_s=_t;
}
 /**//*調(diào)整堆*/
template<typename _Ty>
void HeapAdjust(_Ty* _arr,int _beg,int _end)
  {//_beg _end 第_beg個(gè)元素到第_end個(gè)元素 由1開(kāi)始
for(int i=_beg*2;i<=_end;i*=2)
 {
//索引由1開(kāi)始 使用時(shí)-1
if(i+1<=_end&&_arr[i-1]<_arr[i])++i;//左右結(jié)點(diǎn)元素相比較
if(_arr[i-1]>_arr[i/2-1]) //大于父親結(jié)點(diǎn)則交換
Swap(_arr[i-1],_arr[i/2-1]);
else
return;
}
}

 /**//*堆排序*/
template<typename _Ty>
void HeapSort(_Ty* _arr,int _size)
  {
//將數(shù)組調(diào)整成堆
for(int i=_size/2;i>0;--i)
HeapAdjust(_arr,i,_size);
//取堆頂和最后一個(gè)元素交換
for(int j=_size;j>1;--j)
 {
Swap(_arr[0],_arr[j-1]);
HeapAdjust(_arr,1,j-1);
}
}

 /**//*打印數(shù)組*/
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);
}
|