完全二叉樹中所有非終端節點的值均不大於(或不小於)其左、右孩子節點的值稱為堆。若在輸出堆頂的最小或最大元素後,使得剩餘n-1個元素的序列又建成乙個堆,則得到n個元素中的次小值或次大值,這樣反覆執行,遍得到乙個序列,這樣的過程稱為堆排序。堆排序最壞情況下,其時間複雜度為o(nlogn);
堆排序需要解決兩個問題:
(1)如何由乙個無序的序列建成乙個堆。
(2)如何在輸出頂點元素後,調整剩餘元素成為乙個新的堆。
從乙個無序的序列建成堆就是乙個反覆篩選的過程。若序列看作是乙個完全二叉樹,則從最後乙個非終端節點n/2開始進行篩選。假設輸出堆頂元素之後,以堆中最後乙個元素替換,則需從頂點元素開始,自上而下的進行調整即可。
void
heapadjust
(elementtype list,
int s,
int m)
list[s]
= rc;
//插入位置
}void
heapsort
(elementtype list,
int n)
for(
int i = n ; i >
1; i--
)}
排序 選擇排序 選擇排序 堆排序
寫在前面 上傳github交換排序選擇排序 堆排序 選擇排序 顧名思義,我們就可以猜到,它是原則合適的元素放到合適的位置 從圖中,我們可以得到 1.用第乙個元素,和其他所有的元素進行比較,找出最小的,然後進行交換 2.然後進行,資料的遞增 3.直到資料全部有序 void selectsort int...
選擇排序 堆排序
選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 比如序列 5,5,3 第一次就將第乙個 5 與 3 交換,導致第乙個5挪動到第二個...
選擇排序 堆排序
堆排序 堆排序分為兩個過程 1 將原來無序的數列,轉化成堆序列 建初識堆的過程 2 輸出堆頂元素並調整建新堆的過程 資料結構偽 typeof sqlist heaptype void heapadjuisti heaptype h,int s int m for i h.length i 1 i c...