內容:記錄常見排序演算法裡的堆排序
思路:
1、先將資料構建成最小堆或者最大堆(看從小排到大還是從大排到小來決定)
2、每次從堆頂取出乙個元素放到陣列前面或者後面,然後對剩下的元素進行堆調整
3、依次執行步驟2直至所有元素都已經排序好
應用:
1、可用於對大資料的排序,比如:多路歸併中也會用到類似思路
2、堆排序對原始元素的大小順序不敏感,不會對其排序效能產生太大影響
(不像快排,是有可能退化為冒泡的)
時間複雜度:
建立堆的時間複雜度:o
(n)堆調整的時間複雜度:o
(lgn)
整體時間複雜度:o
(n)+ n *
o(lgn)=o
(lgn)
**:
void
heap_adjust
(int a,
int min,
int max)
if(a[i]
<= tmp)
a[min]
= a[i]
; min = i;
} a[min]
= tmp;
}void
heap_sort
(int a,
int len)
for(
int i = len -
1; i >
0; i--
)}
排序 4 堆排序
將待排序的序列構成乙個大頂堆。此時,序列的最大值就是堆頂的根結點。將它移走 就是,將其與堆陣列的末尾元素交換,此時末尾的元素就是最大值 然後將剩餘的n 1個序列重新構成乙個堆,如此反覆。其中關鍵問題 1 如何將無序序列構成乙個堆 2 輸出堆頂元素後,如何調整公升序元素為乙個堆 4.堆排序 堆調整 v...
排序二 堆排序
子結點的鍵值或索引總是小於 或者大於 它的父節點。堆通過一維陣列實現。在起始陣列為 0 的情形中 父節點i的左子節點在位置 2 i 1 父節點i的右子節點在位置 2 i 2 子節點i的父節點在位置 floor i 1 2 堆中的最大值總是位於根節點。堆中定義以下幾種操作 1 最大堆調整 max he...
排序七 堆排序
時間複雜度 最好 o n o n 平均o n o nlogn 最差o n o nlogn 空間複雜度 o n o 1 穩定性 不穩定 堆 順序儲存的完全二叉樹,其每個結點均小於等於或大於等於其子節點。小根堆 每個結點元素的值都小於等於其子節點元素的值的堆。s i s 2 i 1 s i s 2 i ...