排序演算法之堆排序

2021-07-23 08:44:51 字數 3124 閱讀 8657

堆是一顆完全二叉樹。堆又分大頂堆跟小頂堆,大頂堆即其任意乙個非葉子結點都不小於其子節點,即key[i]>=key[2*i+1]&&key[i]>=key[2*i+2],如下圖:

小頂堆即其任意乙個非葉子結點都不大於其子節點,即滿足key[i]<=key[2i+1]&&key[i]<=key[2i+2]。

如下圖:

對於n個關鍵字序列,最壞情況下每個節點需比較log2(n)次,因此其最壞情況下時間複雜度為nlogn。

堆排序為不穩定排序,不適合記錄較少的排序。

以大頂堆為例:

給定乙個整形陣列a=

一、先將指定序列變為大頂堆,步驟如下:

1)選擇最後乙個非葉子節點的父節點,從其開始,比較其與其左、右(如果存在)子結點的大小,如果子節點比父節點大,則交換位置。

如上圖,最後乙個非葉子結點即7號結點,與其父節點3號結點,a[7] < a[3]所以不用交換。

2)重複遞增選擇剛比較完的結點的相鄰非葉結點直到根節點,比較其與其子結點以及子節點的子節點(若存在,如果子節點還存在子節點的話就一直遞迴下去,直到葉子結點)的大小,按大頂堆的結點大小規則,交換結點的值。

選擇3號結點的相鄰前一結點,即二號結點

比較其與子節點的大小,並與最大的那個節點交換值。交換後如下圖:

繼續選擇1號結點:

比較其與其子結點以及子節點的子節點(若存在,如果子節點還存在子節點的話就一直遞迴下去,直到葉子結點)的大小

先比較子節點與其的大小,並交換值,在比較子節點的子節點與子節點的大小

1比7小不需要交換

接下去選擇1號前一相鄰結點,即0號結點

比較其與其子結點以及子節點的子節點(若存在,如果子節點還存在子節點的話就一直遞迴下去,直到葉子結點)的大小,並交換

比較子節點與其子節點的子節點的大小即下圖中①部分,交換值

再比較子節點的子節點的子節點與該節點的父節點的大小(上圖②部分),即7號結點與3號結點的大小,1比7小,不需要交換。

接下去比較0號節點的左結點與其子結點,不需要交換

如此,無需序列就變成了大頂堆了。

二、對大頂堆進行排序:

步驟

1)將根元素與最後乙個未排元素進行交換

2)剔除最新乙個交換的元素,將新生成的序列重新排成大頂堆。

3)重複以上步驟,直到成為有序序列。

將根元素與最後乙個未排元素進行交換:

排成大頂堆:

重複以上步驟:

如此一來,堆排序便完成了。

父節點為i,左、右子節點分別可以用 2*i+1,2* i+2表示。

public

class heapsorttest ;

print(data5);

heapsort(data5);

system.out.println("排序後的陣列:");

print(data5);

} public

static

void

swap(int data, int i, int j)

data[i] = data[i] + data[j];

data[j] = data[i] - data[j];

data[i] = data[i] - data[j];

} public

static

void

heapsort(int data)

} public

static

void

createmaxdheap(int data, int lastindex)

} if (data[k] < data[biggerindex]) else

} }

} public

static

void

print(int data)

system.out.println();

} }

排序演算法之堆排序

前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉子結點,k 2i 則...

排序演算法之堆排序

堆排序演算法是選擇排序的一種,該演算法只是通過堆,最大堆 或者最小堆選擇出乙個待排序序列中的最大值,或者最小值。要想實現堆排序演算法,就需要構建什麼堆,這裡也最小堆為例。說明什麼是堆,怎麼構建乙個堆。假設待排序序列為a n 為乙個陣列。陣列的長度為n 陣列下標為 0,1,2,i,2i,2i 1 n ...

排序演算法之堆排序

宣告 本博文 為樓主親自編寫並測試,其它內容引用至我一直很崇拜的牛人morewindows。他對排序演算法的講解通俗易懂,給人一種耳目一新的感覺。堆排序與快速排序 歸併排序 一樣都是時間複雜度為o n logn 的幾種常見排序方法。最小堆的講解以及最小堆元素的插入和刪除參見最小堆操作。以下繼續引用以...