堆排序:利用帶大頂堆的特點(從小到大時),按照從右向左、從下自上的順序將所有的非葉子節點都調整成以當前非葉子節點為根的大頂堆,這樣遍歷完成之後,整棵樹就變成了乙個大頂堆,最大的元素在根節點上,這時將這個最大的元素和最後乙個位置上的元素進行交換,這樣最大值就跑到了最後,這樣操作之後,由於整棵樹原本就是大頂堆,雖然把根節點調換了,但底下的還是維持原來的大頂堆特點的,因此只需要對根節點進行調整就好了,也就是呼叫上面的那個方法,這樣length-1次之後就完成了排序;
將指定節點為根節點的樹調整成大頂堆思路:將指定節點和兩個子節點中較大的那個進行比較,但是較高層若發生了交換會影響下面的順序,因此一旦發生了交換,用來交換的那個節點應該也進行判斷直到不發生交換為止。採用插入排序的思想:從給定節點開始和子節點中較大的那個進行比較,如果這個較大的比給定節點還大就將其上移,並將指標指向這個上移的原來的位置,直到不發生上移為止。迴圈結束之後,就找到了給定根節點應該插入的位置。
複雜度分析:最好情況下(也就是已經排好序)為n+nlogn也就是nlogn,最壞情況下為nlogn+nlogn也就是nlogn,因此堆排序的平均複雜度就是nlogn
**如下:
static
void
heapsort
(int
arr)
for(
int i = length -
1; i >
0; i--)}
/** * @param arr 待調整陣列
* @param i 將以索引i為根節點的樹調整成大頂堆
* @param length 待調整陣列的長度
*/static
void
adjustheap
(int
arr,
int i,
int length)
if(temp < arr[j]
)else
} arr[i]
= temp;
}
堆排序學習筆記
參考此文的學習筆記 不用交換,則已經是最大堆,不用迴圈了 else break void sort int a,int length 開始排序,排序是從上到下從左到右的調整 for int j length 1 j 0 j int main sort a,length for int i 0 i l...
學習筆記 堆排序
堆排序運用到了樹的思想。它仍然使用陣列排序,並不建立樹,但是排序時將陣列看作乙個完全二叉樹,通過不斷地構建大頂堆,將樹頂元素與樹尾元素交換,以樹頂構建新的大頂堆來把整個陣列從小到大排序。首先,將數字按從上到下,從左到右的順序寫成一顆完全二叉樹,這樣的樹的特點是,對於父節點i 對應陣列中的下標i 它的...
筆記 堆排序
堆排序只需要記錄乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。堆的定義 n個元素的序列 當且僅當滿足如下關係時,稱之為堆。ki k2ik i k2 i 1 或 ki k 2iki k2i 1 i 1,2,3,n 2 若將和此序列對應的一維陣列看成是乙個完全二叉樹,則堆的含義表明,完全二...