選擇排序 堆排序

2021-09-25 02:00:06 字數 2464 閱讀 2073

參考:

堆是一顆完全二叉樹:葉節點只能出現在最下層和次下層,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹。而且堆還必須滿足以下性質:父節點大於等於左右子節點(大堆),或者父節點小於等於左右子節點(小堆),後面為了表述方便,在文章中只討論大堆。

由此可以看出大堆有二個重要的性質:

1.在堆頂的一定是值最大的元素。

2.堆的左右子樹還是乙個堆。

表示方式出乎想象的簡單。由此圖:

觀察可以發現:i結點的父結點下標就為(i – 1) / 2。它的左右子結點下標分別為2 * i + 1和2 * i + 2。

所以說,只需要將堆按從上到下,從左到右的順序儲存在陣列中即可。用上面總結出的公式尋找某個節點的父節點或者子節點。

按從右到左,從下到上的順序對每個節點進行判斷。確保此節點大於其左右子節點。如果不滿足,就找出左右子節點中最大的,進行交換。當然,交換完成後,子節點可能不再滿足堆的性質,所以需要進行遞迴,直到到達葉子結點。由於最後乙個元素的父節點座標是(n – 1) / 2,大於這個節點的都是葉子節點。所以只需要從(n – 1) / 2開始判斷即可。

時間複雜度:n*lgn。(用極限貌似可以算出來是n,nlgn可以認為是乙個粗略但是正確的結果)

構造出堆之後,將第乙個元素(最大的元素)和陣列最後乙個元素進行交換,同時將堆的規模減小1。

對第乙個元素進行一次維護,時間複雜度為lgn。

重複此步驟,直到每個元素都完成排序。

總時間複雜度為nlgn。

package datastructureandalgorithms;

public

class

selectsort_heapsort

; system.out.

println

("未排序陣列順序為:");

display

(array)

; system.out.

println

("-----------------------");

sort

(array)

; system.out.

println

("-----------------------");

system.out.

println

("經過堆排序後的陣列順序為:");

display

(array);}

// 堆排序

public

static

void

sort

(int

array)

system.out.

println

("構造完成的堆:");

display

(array)

;int count =0;

// 確定位置i上的元素

for(

int i = maxindex; i >=

1; i--)}

public

static

void

buildmaxheap

(int

array,

int index,

int maxindex)

if(right <= maxindex && array[largest]

< array[right])if

(largest != index)

}public

static

void

display

(int

array)

system.out.

println();}}

未排序陣列順序為:

4 2 8 9 5 7 6 1 3

-----------------------

構造完成的堆:

9 5 8 3 4 7 6 1 2

經過第0輪排序後:

8 5 7 3 4 2 6 1 9

經過第1輪排序後:

7 5 6 3 4 2 1 8 9

經過第2輪排序後:

6 5 2 3 4 1 7 8 9

經過第3輪排序後:

5 4 2 3 1 6 7 8 9

經過第4輪排序後:

4 3 2 1 5 6 7 8 9

經過第5輪排序後:

3 1 2 4 5 6 7 8 9

經過第6輪排序後:

2 1 3 4 5 6 7 8 9

經過第7輪排序後:

1 2 3 4 5 6 7 8 9

-----------------------

經過堆排序後的陣列順序為:

1 2 3 4 5 6 7 8 9

排序 選擇排序 選擇排序 堆排序

寫在前面 上傳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...