堆排序,以升序为例,首先将杂乱的数组转化为大顶堆,然后堆顶元素和位元素交换,交换后排除最后一位继续转化位大顶堆,循环往复,数组即有序。
上代码
void HeapShort(int arr[],int len)
{
for(int i=(len-1-1)/2;i>=0;i--)//变大顶堆
{
HeapAdjust(arr,i,len);
}
for(int j=len-1;j>0;j--)
{
int tmp=arr[j];
arr[j]=arr[0];
arr[0]=tmp;//交换堆顶和堆尾数据
HeapAdjust(arr,0,j);//变大顶堆
}
}
void HeapAdjust(int arr[],int pos,int len)
{
int i = pos;
for(int j=2*i+1;j<len;j=2*i+1)
{
if(j<len-1&&arr[j+1]>arr[j])//找到两个枝子最大的
j++;
if(arr[i]>=arr[j])//比较堆顶和枝子中较大者
break;
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;//交换堆顶和枝子中较大的元素
i=j;//因为交换了堆顶和枝子的值,改变了原来以枝子为堆顶的堆,继续循环变大顶堆
}
}