这个接口写的不好,用起来感觉有点别扭,真正要用还需要改改,不应该使用iSize。
感觉把堆当成一个能insert,然后弹出最大的数据的结构使用比较好一些。
另外最好再添加一些如:GetMaxValue,等等的函数
多个已经排好序的连接合成一个,这个用堆排序真的很好,不错。
主要实现了基于堆的排序
对一亿条数据进行测试的结果为:Push,6s;Pop,97s。
如果对于一个需要插入要求高的地方还是可以使用的。
//#include "HeapSort.h"
#include <stdio.h>
#include <stdlib.h>
//现在数组的大小
void Push(int *piArray, int & iSize, const int iInsert)
{
int iIdx;
int iIdxNew;
int iTmp;
iIdx = iSize;
piArray[iIdx] = iInsert;
while(iIdx != 0) {
iIdxNew = (iIdx - 1) / 2;
if(piArray[iIdxNew] >= piArray[iIdx]) {
break;
}
iTmp = piArray[iIdxNew];
piArray[iIdxNew] = piArray[iIdx];
piArray[iIdx] = iTmp;
iIdx = iIdxNew;
}
iSize++;
}
//Size 现在数组的大小
int Pop(int *piArray, int& iSize, int &iPop)
{
int iIdx = 0;
int iIdxNew;
int iLeft, iRight;
int iTmp;
int iMax;
if(iSize <= 0) {
return -1;
}
iPop = piArray[0];
if(iSize == 2) {
piArray[0] = piArray[1];
}
piArray[0] = piArray[iSize - 1];
while(2 * iIdx + 1 <= iSize - 2) {
iLeft = piArray[iIdx * 2 + 1];
if(2 * iIdx + 1 == iSize - 2) { //只还有个左孩子,没有右孩子了
iTmp = piArray[iIdx];
if(iLeft > iTmp) {
piArray[iIdx] = iLeft;
piArray[iIdx * 2 + 1] = iTmp;
}
break;
}
iRight = piArray[iIdx * 2 + 2];
iTmp = piArray[iIdx];
if(iLeft > iRight) {
iIdxNew = iIdx * 2 + 1;
iMax = iLeft;
} else {
iIdxNew = iIdx * 2 + 2;
iMax = iRight;
}
if(iMax > iTmp) {
piArray[iIdx] = iMax;
piArray[iIdxNew] = iTmp;
iIdx = iIdxNew;
} else {
break;
}
}
iSize--;
return 0;
}
/*
int main()
{
int iArray[] = {1, 3, 5, 100, 1000, 30, 57, 8, 7, 6, 5, 4, 2};
int iArraySort[100];
int iSize = 0;
int iNum = sizeof(iArray) / sizeof(iArray[0]);
int iLoop;
for(iLoop = 0; iLoop < iNum; iLoop++) {
Push(iArraySort, iSize, iArray[iLoop]);
}
int iSizeConst = iSize;
int iPop;
for(iLoop = 0; iLoop < iSizeConst; iLoop++) {
if(Pop(iArraySort, iSize, iPop) == -1) {
printf("pop error/n");
}
printf("%d/n", iPop);
}
return 0;
}
*/