调整堆:
void AdjustHeap(int a[],int i,int size)
{
int leftChild = 2 * i;
int rightChild = 2 * i +1;
int adjustIndex = i; //记录调整的位置
if(i < size/2)
{
if(leftChild < size && a[leftChild] >= a[adjustIndex])
{
adjustIndex = leftChild;
}
if(leftChild < size && a[rightChild] >= a[adjustIndex])
{
adjustIndex = rightChild;
}
if(adjustIndex != i)
{
int temp = a[adjustIndex];
a[adjustIndex] = a[i];
a[i] = temp;
AdjustHeap(a,adjustIndex,size);
}
}
}
建立堆:
void BuildHeap(int a[],int size)
{
for(int i= size / 2;i>=0;i--)
{
AdjustHeap(a,i,size);
}
}
实现排序:
int *Sorted(int a[],int size)
{
BuildHeap(a,size);
for(int i = size - 1; i>0 ;i--)
{
int tmp = a[0];
a[0] = a[i];
a[i] = tmp;
AdjustHeap(a,0,i);
}
return a;
}
测试:
int _tmain(int argc, _TCHAR* argv[])
{
int a[] ={0,11,12,3,4};
//int* p = a;
//cout<<*(p+2)<<endl; //*(p + 2) p指向的地址的基础上加2再取值 结果为:12
//cout<<*p+2<<endl; //*p+2 p指向地址的值再加上2 结果为:2
int k[10] ={-9,8,1,2,5,4,7,6,3,9};
int *p = Sorted(k,10);
for(int i=0;i<10;i++)
{
cout<<" "<<*(p + i);
}
return 0;
}
结果: