不簡單的選擇排序 堆排序演算法 5

2021-10-06 10:57:22 字數 1538 閱讀 5501

堆排序(heap sort)就是利用堆(假設利用大堆頂)進行排序的方法。它的基本思想是,將待排序的序列構造成乙個大堆頂。此時,整個序列的最大值就是堆頂的根節點。將它移走(其實就是將其與堆陣列的末尾元素交換,此時末尾元素就是最大值),然後將剩餘的n-1個序列重新構造成乙個堆,這樣就會得到n個元素中的次大值。如此反覆執行,便能得到乙個有序序列了。

/* 對順序表l作堆排序*/

#include

#define maxsize 10

typedef

struct

sqlist;

void

swap

(sqlist *l,

int i,

int j)

/*已知l->r[s..m]中記錄的關鍵字除l->r[s]之外均滿足堆的定義*/

/*本函式調整l->r[s]的關鍵字,使l->r[s..m]成為乙個大堆頂*/

void

heapadjust

(sqlist *l,

int s,

int m)

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--

)//將每個最大值的根結點與末尾元素交換,再次調整其成為大堆頂

}int

main()

heapsort

(&h)

;for

(int i =

1; i < n; i++)}

/*程式執行示例:

堆排序的效率到底有多高呢?它的執行時間主要是消耗在初始構建堆和在重建時的反覆篩選上。在構建堆的過程中,因為我們是完全二叉樹從最下層最右邊的非終端節點開始構建,將它與其孩子進行比較和若有必要的交換,對於每個非終端節點來說,其實最多進行兩次比較和互換操作。因此真個構建堆的時間複雜度為o(n).

總體來說,堆的時間複雜度為o(nlo

gnnlogn

nlog

n)。由於堆排序對原始記錄的排序狀態並不敏感,因此,它無論最好、最壞和平均時間複雜度均為o(nlo

gnnlogn

nlog

n)。這在效能上顯然要遠遠好於冒泡、簡單選擇、直接插入的o(n

2n^2

n2)的時間複雜度了。

空間複雜度上,它只有乙個用來交換的暫存單元,也非常的不錯。不過由於記錄的比較與交換是跳躍式進行,因此堆排序也是一種不穩定的排序方法。

排序演算法 選擇排序 簡單排序 堆排序

1 介紹。在簡單選擇排序過程中,所需移動記錄的次數比較少。最好情況下,即待排序記錄初始狀態就已經是正序排列了,則不需要移動記錄。最壞情況下,即待排序記錄初始狀態是按第一條記錄最小,之後的記錄從小到大順序排列,則需要移動記錄的次數最多為3 n 1 簡單選擇排序過程中需要進行的比較次數與初始狀態下待排序...

選擇排序演算法 堆排序

選擇排序演算法 堆排序 堆排序的結構思想就是 先構建 例如大頂堆 然後調整。構建堆,在構建過程中,用到3個變數,root,last,child,其中有兩步 比較左右孩子大小,然後將大的值與root比較並且 是否 交換位置。另外,構建完成之後,接著迴圈將最後乙個元素與第乙個元素交換位置,然後接著從第乙...

選擇排序 簡單選擇排序 堆排序

一 簡單選擇排序 對於n個數要進行n次排序,第一次,將最小的數放在第乙個。第二次,將第二小的樹,放在第二個。每次都和後面的數做比較,如果是從小到大的排序,當當前的數字比後面的大時,要進行交換。include void chosesort int a,int length void main int ...