堆排序
先看兩個定義:
大根堆,小根堆類似於二叉樹的結構
大根堆:根比左右結點都大
小根堆:根比左右結點都小
堆排序主要是堆調整函數,進行一次堆調整後找到最大或者最小,此後此結點不參與調整,已經排序好了。
然後把555和17交換,555就放在了應該放的位置。
//////堆調整函數////////
void heap_adjust(int *arr,int len)
{
//把數組看成二叉樹
//從結點開始調整,葉節點無左右孩子
for (int i=len/2-1;i>=0;--i)
{
int tmp = i;
if (2*i+1 < len && arr[tmp]<arr[2*i+1])
tmp=2*i+1;
if (2*i+2 < len && arr[tmp]<arr[2*i+2])
tmp=2*i+2;
//找出左右節點和根節點中的最大值,放到根節點
if (tmp != i)
{
swap(&arr[i],&arr[tmp]);
}
}
//一次調整後,把最大值換到最後
swap(&arr[0],&arr[len-1]);
}
void HeapSort(int *arr,int len)
{
assert(NULL != arr);
for (int i=len;i>0;--i)
{
//參與調整的數越來越少
heap_adjust(arr,i);
}
}
就完成了堆排序