基本排序之堆排序

2022-08-16 02:51:15 字數 1361 閱讀 3522

堆排序:

它可以看做是完全二叉樹的結構。

分為大根堆和小根堆。如果父節點大於左右節點就是大根堆,父節點小於左右子節點就是小根堆。本文寫大根堆的排序。

設當前節點為i的話:

子節點:2*i+1,2*i+2

父節點:(i-1)/2

概述:

(1)建立大根堆(heapinsert):把當前節點和父節點比較,如果大於父節點,那麼就上公升。如果小於父節點,那麼不做變動。

(2)調整堆(heapify):建立大根堆後,現在的堆每乙個父節點都大於其左右兩個子節點。那麼最頂部就是最大的值。此時應當:

i)        把最頂部的元素和最後乙個元素交換,讓最大的元素處於末尾。

ii)       調整,如果現在最頂部元素的值不是最大值,也就是說,把它和它的左右子節點中大的那個節點比較,如果小於這個子節點,那麼這個子節點和它交換,父節點下沉。

iii)       不斷比較,直至不能下沉為止。然後重複前兩步操作,直至整個陣列排好。

其中排好的標誌:我們先定義個乙個長度表示建立大根堆之後的陣列長度,每一次(2)(i)之後,表示乙個數排好了,那麼這個陣列長度就減去1,如果這個陣列長度為0,那麼排序也就結束了。

時間複雜度:

o(nlogn)

演算法穩定性:

不穩定演算法。

**如下:

#include #include 

#include

using

namespace

std;

class

heapsort_

;void heapsort_::heapsort(vector &v)

for (int i = 0; i < v.size(); i++)

for (int size = v.size()-1; size > 0; size--)

}//建立大根堆

void heapsort_::heapinsert(vector &v,int

index)

}void heapsort_::heapify(vector &v,int

size)

}void heapsort_::swap(vector &v, int a, int

b)int

main()

h.heapsort(v);

for (int i = 0; i < 15; i++)

return0;

}

排序之堆排序

堆排序是一種基於比較排序的另一種排序演算法,它採用了一種近似完全二叉樹的二叉堆資料結構。演算法實現相容了插入排序的空間原址性 即只需要有限個額外的儲存空間 和歸併排序的優良時間複雜度。偽 如下 heapsort a build max heap a for i a.length downto 2 e...

排序之堆排序

這裡沒有對0號元素進行排序 堆排 public class heap public static void exec comparable array,int i,int j 下沉 private static void sink comparable array,int k,int n publi...

排序之堆排序

堆其實是一種完全二叉樹,從上到下從左到右,大頂堆的父節點大於其左右子節點,小頂堆的父節點小於其左右子節點 1 首先是進行heapify,建立堆 2 從下到上,從右到左的進行heapify構建有序的堆 3 進行排序,將堆頂父節點和底層最右邊的子節點互換,然後不斷重複以上步驟 1 heapify def...