資料結構與演算法(十二) 堆排序

2022-01-09 22:53:15 字數 2474 閱讀 3417

對於「」我們可以理解為具有以下性質的完全二叉樹

堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o(nlogn),它也是不穩定排序。

在排序時,一般公升序採用大頂堆,降序採用小頂堆。

我們可以看到,層數從小到大,節點的數字是越來越小的,對映到陣列有:

特點是arr[i] >= arr[2*i+1] && arr[i] >= arr[2*i+2]

跟大頂堆相反,層數從小到大,節點的數字是越來越大,對映到陣列:

特點是:arr[i] <= arr[2*i+1] && arr[i] <= arr[2*i+2]

對陣列進行排序。

第一遍排序

我們從最後乙個非葉子結點開始排序。第乙個非葉子結點為arr.length/2-1=5/2-1=1,也就是元素6.,我們對他進行對比並調整位置;

在中,5比6小,而9比6大,所以9和6交換位置;

接著找到第二個非葉子節點4,由於9是這個樹中最大的,故9與4交換位置

由於9與4交換位置打亂了原先這棵樹順序,所以繼續對新樹進行排序

由此得到了乙個大頂堆,然後將堆頂元素9與末尾元素4進行交換,得到陣列

至此,第一遍排序已經完成,我們確定了最大元素9的位置

第二遍排序

第二遍排序開始時,最大元素9的位置已經確定,實際上要排序的陣列變成了

繼續從6開始比較,排序正常,所以接著比較,8是最大的,所以與4交換位置

由此得到了乙個大頂堆,然後將堆頂元素8與末尾元素5進行交換,得到陣列

至此,第一遍排序已經完成,我們確定了最第二大元素8的位置

第三遍~第n遍排序

第二遍排序開始時,最大元素9和第二大元素8的位置已經確定,實際上要排序的陣列變成了

重複比較-排序-交換堆頂和隊尾元素位置這一過程,直到最終獲得有序數列

* @description:堆排序

*/public class heapsort

int temp = 0;

//交換陣列頭尾元素,將最大的元素排沉到隊尾

for (int i = arr.length - 1; i > 0; i--)

return arr;

}/**

* 將以非葉子節點i為根節點的樹調整為乙個大頂堆

* @param arr 要調整的陣列

* @param i 非葉子結點在陣列中的下標

* @param length 要調整的陣列長度

*/public static int sortheap(int arr, int i, int length)

//獲取根節點值

int temp = arr[i];

//從左節點開始遍歷

for (int j = i * 2 + 1; j < length; j = j * 2 + 1)

//比較將左右節點與父節點大小

if (arr[j] > temp) else

}//結束迴圈時,arr[i]已經存放了以原arr[i]為根節點的樹的最大值

arr[i] = temp;

return arr;}}

資料結構與演算法 堆排序

1 堆的性質 堆是一棵完全二叉樹,除最後一層外每層都是滿的 元素個數為2 i 1 根節點為第1層 最後一層如果不滿則只缺少右邊葉結點。如果按照廣度優先,即從上至下,從左至右對節點編號。根節點序號為0,節點i的父節點是 i 1 2,左子節點是2 i 1。最小堆中任意父節點不能比子節點大,最大堆中任意父...

資料結構與演算法 堆排序

基礎概念 堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o nlogn 它也是不穩定排序。通俗理解 將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n 1個元素重新...

資料結構與演算法 堆排序

堆排序堆排序是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的結構,並同時滿足堆的性質 即子節點的鍵值或索引總是小於 或者大於 它的父節點,堆排序的時間複雜度為o nlogn 來自維基百科 什麼是堆 堆是一種特殊的完全二叉樹,它的性質為 任意節點大於等於或者小於等於它的左右節點。...