堆排序 C語言

2021-09-10 22:01:16 字數 949 閱讀 8284

昨天寫了選擇排序中的簡單選擇排序,今天把另一種選擇排序演算法–堆排序寫一下。以前一直對堆排序有所誤解,現在再次去學習才知當日只是明白了調整堆的演算法,而不知道實際具體的排序,現在想來還是當時對自己太仁慈的緣故。

將無序序列建成乙個堆,得到關鍵字最小(或最大)的記錄;輸出堆頂的最小(大)值後,使剩餘的n-1個元素重新又建成乙個堆,則可得到n個元素的次小值;重複執行,得到乙個有序序列,這個過程叫堆排序。

由此,實現堆排序需要解決兩個問題:

(1)如何由乙個無序序列建成乙個堆?

(2)如何在輸出堆頂元素之後,調整剩餘元素成為乙個新的堆?

**如下:

#include

/* * 堆排序--調整堆,arr為待調整陣列,s為開始位置,e為最大長度*/

void

adjheap

(int arr,

int s,

int e)

if(arr[s]

< arr[j]

) s = j;}}

/* * 堆排序*/

void

heapsort

(int arr,

int len)

for(i = len -

1;i >

0;i--)}

intmain()

;int i =0;

for(i =

1;i <

8;i++

)printf

("\n");

heapsort

(arr,7)

;for

(i =

1;i <

8;i++

)printf

("\n");

return0;

}

堆排序適用於len比較大的情況,其時間複雜度為o(nlogn),堆排序也是一種不穩定的排序演算法。

c語言堆排序

再看資料結構書的時候,發現堆排序以前根本不懂,以前理解的不是很深刻,對演算法也是一知半解,萬一找工作碰到這樣的筆試題或者面試題,豈不是over了!先梳理一下堆排序的知識吧 堆排序只需要乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。1 堆是完全二叉樹,但不一定是滿二叉樹 2 因為堆不滿足...

堆排序(c語言)

堆排序的基本思想是 將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n 1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了 構建初始堆 公升序建大堆,降序建小堆 a.給定乙個無序陣列 ...

C語言 堆排序

堆排序是指利用堆這種 資料結構 所設計的一種 排序演算法 它是選擇排序的一種。可以利用 陣列的特點快速定位指定索引的元素。堆分為大頂堆和小頂堆,是 完全二叉樹 大頂堆的要求是每個節點的值都不大於其父節點的值 在對陣列從小到大排序時,需要使用的就是大頂堆,根據大頂堆的要求可知,最大的值一定在堆頂。以 ...