直接上代码
#include
#include
#include
#include
#define MAXRANDOM 10000 //产生最大随机数
#define LINESHOWNUM 18 //每行显示的数目
void swap(int* pA, int *pB)
{
if(NULL == pA || NULL == pB)
{
return ;
}
int iTmp = *pA;
*pA = *pB;
*pB = iTmp;
}
void printArray(int* pArray, int num)
{
if(NULL != pArray)
{
int i = 0;
for( ; i < num; )
{
printf("%5d ", pArray[i++]);
if(i%LINESHOWNUM == 0)
{
putchar('\n');
}
}
printf("\n");
}
}
void AdjustHeap(int* pArray, int nOff)
{
if(NULL == pArray || nOff <= 1)
{
return;
}
int nParent = nOff/2;
while(nParent > 0)
{
if(pArray[nOff - 1] > pArray[nParent - 1])
{
swap(pArray + nOff -1, pArray + nParent - 1);
}
nOff /= 2;
nParent = nOff/2;
}
}
void CreatHeap(int *pArray, int nLenth)
{
if(NULL == pArray || nLenth <= 1)
{
return;
}
int nLeafNode = nLenth / 2;
while(nLeafNode < nLenth)
{
AdjustHeap(pArray, ++nLeafNode);
}
}
void HeapSort(int *pArray, int nLenth)
{
if(NULL == pArray || nLenth < 1)
{
return;
}
CreatHeap(pArray, nLenth);
int nTmp = nLenth;
while(nTmp > 0)
{
swap(pArray, pArray + nTmp - 1);
CreatHeap(pArray, --nTmp);
}
}
int main(int argc, const char *argv[])
{
if(argc < 2)
{
fprintf(stderr, "Usage: %s num", argv[0]);
return -1;
}
int num = atoi(argv[1]);
if(num < 1)
{
fprintf(stderr, "Num Must greater than 1");
return -1;
}
int* pArray = (int*)malloc(num*sizeof(int));
if(NULL == pArray)
{
fprintf(stderr," Creat array error!");
return -1;
}
printf("正在生成长度为%d的随机数组!\n", num);
srand(time(0));
int i = 0;
for( ; i < num; ++i)
{
pArray[i] = rand()%MAXRANDOM;
}
printf("排序前:\n");
//printArray(pArray, num);
HeapSort(pArray, num);
printf("排序后:\n");
printArray(pArray, num);
free(pArray);
return 0;
}