(编程小白,欢迎大家一起探讨)
从小到大排序:建大根堆
大根堆(大顶堆)是指根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,属于二叉堆的两种形式之一。
//交换两个位置的值
void swap(int arr[], int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//建大根堆,找到最大元素
void heapinsert(int arr[],int index)
{
while(arr[index]>arr[(index-1)/2])
{
swap(arr,index,(index-1)/2);
index=(index-1)/2;
}
}
//将最大元素与最后元素交换后,重新调整堆为大根堆,周而复始
void heapify(int arr[],int index,int R)
{
int left=2*index+1;
while(left<=R)
{ //将父节点与左孩子和右孩子比较,调整堆的结构
int max=((left+1<=R)&&(arr[left+1]>arr[left]))?left+1:left;
if(arr[index]<arr[max])
{
swap(arr,index,max);
index=max;
left=2*index+1;
}
else break;
}
}
void heapsort(int arr[],int L,int R)
{
int i;
for(i=0;i<R;++i)
heapinsert(arr,i);
int last=R-1;
while(last>=0)
{
swap(arr,0,last);
heapify(arr,0,--last);
}
}