堆排序演算法基於選擇排序的思想,利用堆結構和二叉樹的一些性質來完成資料的排序。
對堆中的結點按層進行編號,將其對映到陣列中會有以下特點:
小頂堆:每個結點的值都小於或等於其左右子結點的值。
a[i] <= a[2*i+1] && a[i] <= a[2*i+2]
大頂堆:每個結點的值都大於或等於其左右子結點的值。
a[i] >= a[2*i+1] && a[i] >= a[2*i+2]
最壞,最好,平均時間複雜度均為1)將無序序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆;
2)將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端;
3)重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序
void adjustheap(int *a, int i, int len)
if (temp < a[j])
else
break; }}
void heapsort(int *a, int len)
// 交換堆頂元素與末尾元素,並調整堆結構
for (int klen = len - 1; klen > 0; klen--)
}
經典排序演算法 堆排序Heap sort
經典排序演算法 堆排序heap sort 堆排序有點小複雜,分成三塊 第一塊,什麼是堆,什麼是最大堆 第二塊,怎麼將堆調整為最大堆,這部分是重點 第三塊,堆排序介紹 第一塊,什麼是堆,什麼是最大堆 什麼是堆 這裡的堆 二叉堆 指得不是堆疊的那個堆,而是一種資料結構。堆可以視為一棵完全的二叉樹,完全二...
經典排序演算法 堆排序(Heap Sort)
首先堆是乙個完全二叉樹,但同時他具有這樣的要求 每乙個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆 每乙個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。如下圖是乙個大頂堆 在此要補充乙個二叉樹的性質 二叉樹的某個節點下標為i,則它的左孩子的下標一定為2i,右孩子下標一定為2i 1。假如現...
排序演算法之堆排序 Heap Sort
堆排序是一種選擇排序,其時間複雜度為o nlogn 堆的定義 n個元素的序列當且僅當滿足下列關係之一時,稱之為堆。情形1 ki k2i 且ki k2i 1 最小化堆或小頂堆 情形2 ki k2i 且ki k2i 1 最大化堆或大頂堆 其中i 1,2,n 2向下取整 若將和此序列對應的一維陣列 即以一...