堆排序演算法 C語言

2021-09-29 03:08:57 字數 1320 閱讀 8590

本次排序結果為非遞減,採用的是大頂堆。

假設輸出堆頂元素之後,以堆中最後乙個元素替代之,此時根節點的左右值比較,由於左子樹根節點的值大於右子樹的根節點的值且大於根節點的值,則將27和97交換,由於97替代了27之後破壞了右子樹的堆,則需要進行上述相同的調整,直至葉子節點,此時堆頂為n-1個元素中的最大值,重複上述過程,將堆頂元素27和堆中最後乙個元素97交換,得到新堆。

從乙個無序序列建堆的過程就是乙個反覆篩選過程。若將此序列看成是乙個完全二叉樹,則最後乙個非終端點是第n/2個元素,由此篩選只需從第n/2個元素開始。

#include#define maxsize 20		//陣列大小

typedef int keytype; //關鍵字型別

typedef int infotype; //元素資訊型別

//陣列中元素的資訊

typedef structredtype;

//陣列的型別

typedef structsqlist;

typedef sqlist heaptype; //堆型別

int count=0;

//初始化待排序列

void init(sqlist *l,int a,int length)

l->length = length;

}//交換堆中元素

void swap(redtype *p,redtype *q)

//列印堆

void print(heaptype *l) }}

//調整堆

void heapadjust(heaptype *h,int s,int m)

h->r[s] =rc;

}//堆排序

void heapsort(heaptype *h)

}int main();

init(&l,a,9);

printf("排序前:");

for(i = 0;i < 9;i++)

printf("\n下標號:");

for(i = 0;i < 9;i++)

printf("\n");

print(&l);

heapsort(&l);

printf("\n\n排序後:");

for(i = 0;i < 9;i++)

printf("\n下標號:");

c語言堆排序

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

堆排序(c語言)

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

C語言 堆排序

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