堆排序
来源:互联网 发布:淘宝 补全会员名 编辑:程序博客网 时间: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
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- WikiPedia技术架构学习笔记
- 诸神之战:IT四雄为争夺创新经济主导权而厮杀
- Twitter网站架构介绍
- android intent
- android 动画效果,留着研究。
- 堆排序
- windows系统 Oracle 数据库连接数的修改
- WINCE6.0建立共享文件夹
- MultiProcess进程池的设计(三)主进程和子进程间的通信
- phpcms模板的使用方法
- First
- ubuntu SVN命令大全
- ubuntu 启动时 设置多个ip 修改mac 网关 。。。
- 四级之翻译备考