資料結構基礎整理 排序 03 堆排序

2021-10-03 02:53:25 字數 1089 閱讀 1914

堆排序(英語:heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。

堆是具有以下性質的一棵樹:

//s是要需要調整堆結構的順序表的下標元素

//調整完後使之成為大頂堆,m是堆的大小

void heapadjust(sqlist* l, int s, int m)

//此時的temp其實就是傳進來需要調整的下標值,此時的j是傳進來的結點的左右子樹中值較大的值

if (temp >= l->r[j])//如果傳進來的這個值已經比左右子樹都要大了,那麼直接退出迴圈

l->r[s] = l->r[j];//如果之前那個結點的值不比左右子樹都大,那麼就把左右子樹中的較大值給這個結點

s = j;//此時需要改變的結點是左右子樹中較大的結點,再次迴圈

} l->r[s] = temp;//找到需要插入的位置,插入元素

}

void heapsort(sqlist* l)

for (i = l->length; i > 1;i--)

}

從上面的**可以看出,整個**中都沒有涉及樹的結構,而是一直在用那個需要排序的是順序表。其實,堆排序並沒有真正的用到堆的結構,而是將待排序的順序表中的元素順序變為堆的層序遍歷的順序,因為最終用到堆的地方,就是每次從堆頂拿出喲個最大的元素放到表尾。

初始的順序表其實可以看出乙個按層序遍歷的二叉樹序列,所以,我們要想將這個順序表變為乙個大頂堆,只需要對這個順序表的一半的元素進行堆調整進行了,因為一半已經是完全二叉樹所有的中間結點了。

堆調整就是對傳入的結點不斷的與左右結點比較,取得最大值,直到這個結點找到合適的位置插入,在插入這個結點前,已經對這個結點本來位置到插入的位置,都進行了堆調整。具體如何實現,可以試著模仿計算機進行執行該程式,找到這個調整的思想。

堆排序的前半部分,把順序表構成了大頂堆結構,後半部分只需要每次把乙個堆頂值放到末尾的地方,就完成了排序的過程,相當於是倒著降序。

堆排序的最憂,最壞,平均時間複雜度都是

資料結構基礎7 3 堆排序

堆排序是利用堆的性質進行的一種選擇排序。1.將初始待排序關鍵字序列 r1,r2.rn 構建成大頂堆,此堆為初始的無序區。2.將堆頂元素r 1 與最後乙個元素r n 交換,此時得到新的無序區 r1,r2,rn 1 和新的有序區 rn 且滿足r 1,2.n 1 r n 3 由於交換後新的堆頂r 1 可能...

資料結構基礎 19 堆與堆排序

首先讓我們回顧一下完全二叉樹的兩個性質 性質1 具有n個結點的完全二叉樹的深度為 logn 向下取整 1。性質2 若對含 n 個結點的完全二叉樹從上到下且從左至右進行 1 至 n 的編號,則對完全二叉樹中任意乙個編號為 i 的結點 1 若 i 1,則該結點是二叉樹的根,無雙親,否則,編號為 i 2 ...

資料結構基礎 19 堆與堆排序

首先讓我們回顧一下完全二叉樹的兩個性質 性質1 具有n個結點的完全二叉樹的深度為 logn 向下取整 1。性質2 若對含 n 個結點的完全二叉樹從上到下且從左至右進行 1 至 n 的編號,則對完全二叉樹中任意乙個編號為 i 的結點 1 若 i 1,則該結點是二叉樹的根,無雙親,否則,編號為 i 2 ...