解除安裝最前面,下面的所有討論都是基於二叉堆
一:什麼是堆:
堆是乙個陣列結構,可以看著為一顆完全二叉樹,把這顆完全二叉樹按層從上到下,每層從左至右編序號,每個序號所對應的元素即為陣列中該序號的元素;該樹出最後一層以外每一層都排滿,最後一層從左至右,先左孩子再右孩子排列,如果有父節點沒有排滿孩子(無孩子或無右孩子),只可能是右邊的父節點未排滿孩子。
因此該結構有如下結構:
如果節點i,則它的左孩子為2*i,右孩子為2*i+1;原因:節點i所對應的深度為h=log2(i);所以左孩子為2^log2(i)+2*(i-i/2)=2i;
二:堆排序過程
先構建堆—》把最後乙個節點和第乙個節點互換—》調整堆—》第乙個節點與倒數第二個節點互換,依次進行:
三:**
#include
#include
/*假設i的左孩子與右孩子已經是乙個最大堆,現在要把i放入到堆中,如果i比左右孩子都大直接放入,如果i比左孩子或者右孩子小,則與該孩子互換,交換以後再調整該孩子所在子樹,一直調整到合適位置為止
*/void heapify(int *parray, int i, int iheapsize)
else
}if(iright < iheapsize && *(parray + iright) > *(parray + ilargest))
if(i != ilargest)
else}/*
因為n/2+1~n都為葉子節點;
最後一層深度h = log2(n);倒數第二層最後乙個節點為:2^(log2(n)-1)=n/2
*/void buid_heap(int *parray, int size)
}void heap_sort(int *parray, int size)
}
最大堆排序
其實堆排序就是對二叉樹的一種操作,使得二叉樹的左右孩子 節點都小於父節點。我使用的是陣列的實現方式,parent i return i 2 i的父節點下標,left i return 2 i i的左子節點 right i return 2 i 1 i的右子節點.以上均為陣列元素的標號位置,在訪問元素...
最大堆實現堆排序
堆排序 這裡使用的是最大堆 思想 1 將當前的堆轉換成最大堆 從最大的非葉子結點開始,1 判斷根結點和左右結點的大小交換相互的位置,使得該子樹成為最大堆,每次交換成功後就繼續往該結點的子結點去重複 1 操作,直到根結點後再去下乙個非葉子結點,直到根結點 2 轉成最大堆後,每次就將第乙個結點互最後乙個...
最大堆排序 C
堆排序是一種複雜度為o nlog n 的一種高效的排序,這裡將展示最大堆的排序演算法。堆排序是將陣列抽象化成為乙個完全二叉樹。這裡對 a 10 抽象的二叉樹結構如下 1 下面三個節點是得到左子節點,右子節點,和父節點。intleft inti 返回左兒子 intright inti 返回右兒子 in...