|
如果有错,希望能指出,谢谢。
/**//* 堆排序。 */ #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); }
|