資料結構之堆排序

2021-07-11 02:54:38 字數 1120 閱讀 2741

堆排序就是利用堆(本文利用大頂堆)進行排序的方法。它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。它的基本思想是,將待排序的序列構造成乙個大頂堆。此時,整個序列的最大值就是堆頂的根結點。將它移走(就是將它與堆陣列的末尾元素交換,此時末尾元素就是最大值),然後將剩餘的n-1個序列重新構成乙個堆,這樣就會得到n個元素中的次小值。如此反覆進行,便能得到乙個有序序列了。

堆排序是一種不穩定的排序演算法,適用於資料量較多的情況。時間複雜度為o(nlogn)

本程式利用陣列儲存若干個資料。陣列下標從0開始。

#include

#include

#include

using

namespace

std;

void heapadjust(int arr, int s,int m)

arr[s] = temp;

} void heapsort(int arr,const

int size) }

int main()

;

int n = sizeof(arr) / sizeof(arr[0]);

heapsort(arr, n);

for (int j = 0; j < n; ++j)

cout

<< endl;

}

程式實現:

heapsort()函式分為兩個for迴圈。第乙個for迴圈要完成的就是將現在的待排序序列構建成乙個大頂堆。第二個迴圈要完成的是逐步將每個最大值的根節點與末尾元素交換,並且再調整其成為大頂堆。

heapadjust()函式執行流程結果:

對於每乙個編號s的節點,首先比較它的兩個子節點,找到最大的那個,然後比較父節點和子節點誰大誰小,如果父節點大則進入下輪迴圈,否則子節點的值傳給父節點。全部完成,則出現大頂堆。

當前節點序號是s,則左孩子節點序號都是2*s+1,右孩子節點是2*s+2。

所以若遍歷所有節點,heapsort()中的i需要從size/2-1到0

資料結構之堆排序

在資料結構中,堆排序是非常重要的乙個知識點,尤其像在期末考試 考研等計算機考試中經常會考察堆排序,並要求畫出示意圖.下面主要通過一道考研題目講述堆排序的知識,希望對大家有所幫助.文章內容參考嚴蔚敏的 資料結構 王道論壇的 資料結構 和自己的一些理解 參看動態圖 堆排序是一種樹形選擇排序方法,它的特點...

資料結構之堆排序

堆具有完全二叉樹的性質 每個結點大於等於左右孩子的堆稱為大頂堆,或每個結點小於或等於左右孩子的堆稱為小頂堆。堆排序 將待排序的序列構建成乙個大頂堆,此時,最大值在整個堆的根結點。將它移走 其實就是將它與堆陣列的末尾元素交換,此時末尾元素就是最大值 然後將剩餘的n 1個序列重新造成乙個,這樣會得到n個...

資料結構之堆排序

堆的排序主要是2個步驟 一 構建堆。二 排序調整堆 步驟一 需要注意的是,構建堆時,比較的是父節點f和兩個孩子sonl,sonr節點的大小,三個節點中誰的值大,誰坐父節點的位置。但是sonl或者sonr與父節點f交換位置以後,還要繼續調整sonl或者sonr與父節點交換位置後的子樹 舉例 假設son...