堆排序

来源:互联网 发布:淘宝 补全会员名 编辑:程序博客网 时间:2024/05/20 07:58
/* FUNCTION_BEG *****************************************************   函数名:THeapSort   功能:堆排序树及数组执行堆排序   算法:    实现:Snight Q:51171107   FUNCTION_END  ******************************************************/#ifndef H_HEAPSORT_H#define H_HEAPSORT_H/* 小根堆排序 */template <class T>int THeapSortP(T* apArray, unsigned long aulSize);/* 大根堆排序 */template <class T>int THeapSortR(T* apArray, unsigned long aulSize);/****** Achieve ******/template <class T>unsigned long THeapSerachVertexP(unsigned long aiStartPort, T* apArray, unsigned long& aulLastPos, T& loValue){if (aiStartPort > aulLastPos)return 0;if ((loValue < apArray[aiStartPort])||(1 == aulLastPos))return aiStartPort;if (apArray[aiStartPort] >  loValue){return aiStartPort;}else{int liLeftPos=THeapSerachVertexP(aiStartPort<<1, apArray, aulLastPos, loValue);int liRightPos=THeapSerachVertexP((aiStartPort<<1) +1 , apArray, aulLastPos, loValue);if ((0 == liLeftPos)&& (0 == liRightPos))return aulLastPos;else if ((0 == liLeftPos) && (0 != liRightPos))return liRightPos;else if ((0 != liLeftPos) && (0 == liRightPos))return liLeftPos;elsereturn  liLeftPos < liRightPos ? liLeftPos : liRightPos;}return 0;}template <class T>unsigned long THeapSerachVertexR(unsigned long aiStartPort, T* apArray, unsigned long& aulLastPos, T& loValue){if (aiStartPort > aulLastPos)return 0;if ((loValue > apArray[aiStartPort])||(1 == aulLastPos))return aiStartPort;if (apArray[aiStartPort] <  loValue){return aiStartPort;}else{int liLeftPos=THeapSerachVertexR(aiStartPort<<1, apArray, aulLastPos, loValue);int liRightPos=THeapSerachVertexR((aiStartPort<<1) +1 , apArray, aulLastPos, loValue);if ((0 == liLeftPos)&& (0 == liRightPos))return aulLastPos;else if ((0 == liLeftPos) && (0 != liRightPos))return liRightPos;else if ((0 != liLeftPos) && (0 == liRightPos))return liLeftPos;elsereturn  liLeftPos < liRightPos ? liLeftPos : liRightPos;}return 0;}// 小根排序实现template <class T>int THeapSortP(T* apArray, unsigned long aulSize){if ((NULL == apArray) || (aulSize <= 0))return 0;T* lpTempArray = new T[aulSize+1];memset(lpTempArray, 0 , sizeof(T)*(aulSize+1));// 被替换的节点位置unsigned long loVertexP = 0;unsigned long lulEvCont = 1;for (unsigned long liPos = 0; liPos < aulSize; ++liPos){if  (0 < (loVertexP = THeapSerachVertexP(1 , lpTempArray, lulEvCont, apArray[liPos]))){memcpy(&lpTempArray[loVertexP+1],  &lpTempArray[loVertexP],  (aulSize - loVertexP)*sizeof(T));lpTempArray[loVertexP] = apArray[liPos];}else{lpTempArray[lulEvCont-1] = apArray[liPos];}lulEvCont++;}memcpy(apArray, lpTempArray+1, sizeof(T)*aulSize);delete [] lpTempArray;return 1;}// 大根排序实现template <class T>int THeapSortR(T* apArray, unsigned long aulSize){if ((NULL == apArray) || (aulSize <= 0))return 0;T* lpTempArray = new T[aulSize+1];memset(lpTempArray, 0 , sizeof(T)*(aulSize+1));// 被替换的节点位置// 被替换的节点位置unsigned long loVertexP = 0;unsigned long lulEvCont = 1;for (unsigned long liPos = 0; liPos < aulSize; ++liPos){if  (0 < (loVertexP = THeapSerachVertexR(1 , lpTempArray, lulEvCont, apArray[liPos]))){memcpy(&lpTempArray[loVertexP+1],  &lpTempArray[loVertexP],  (aulSize - loVertexP)*sizeof(T));lpTempArray[loVertexP] = apArray[liPos];}else{lpTempArray[lulEvCont-1] = apArray[liPos];}lulEvCont++;}memcpy(apArray, lpTempArray+1, sizeof(T)*aulSize);delete [] lpTempArray;return 1;}#endif//H_HEAPSORT_H