堆建立 插入 刪除和排序

2021-09-01 20:48:09 字數 1697 閱讀 5471

#ifndef _heap_h_

#define _heap_h_

#include#include#include#include#include#define maxsize 10

typedef int datatype;

typedef struct heap

heap,*pheap;

//堆的初始化

void heapinit(pheap hp)

hp->capacity = maxsize;

}//建堆

void creatheap(pheap hp)

}//向下調整(建堆)

void adjustdown(pheap hp,int parent)

}

//堆尾的插入

void heapinsert(pheap hp, datatype data)

hp->arr[hp->size] = data;

hp->size++;

adjustup(hp);

}//向上調整(插入)

void adjustup(pheap hp)

}

//堆頂的刪除

void heapdel(pheap hp)

void adjustdown(pheap hp,int parent)

}

若在輸出堆頂的最小值之後,使得剩餘n-1個元素的序列重建乙個堆,則得到n個元素中的次小值。如此反覆執行,便能得到乙個有序序列,這個過程稱之為堆排序。

輸出堆頂元素之後,以堆中最後乙個元素替代之,此時根結點的左右子樹均為堆,則僅需進行一次從上到下的調整即可重建乙個堆。

堆排序演算法。

形參heap為大頂堆時,實現的是由小到大;

形參heap為小頂堆時,實現的是由大到小;

void heapsort(pheap hp)

} printf("堆排序:");

for (int i = 0; i < num; i++)

}

int main()

printf("\n");

//建立小頂堆並列印

creatheap(hp);

printf("建立小頂堆:");

for (int i = 0; i < hp->size; i++)

printf("\n");

//堆插入資料 3

heapinsert(hp, 3);

printf("堆插入資料 3:");

for (int i = 0; i < hp->size; i++)

printf("\n");

//堆頂的刪除

heapdel(hp);

printf("堆頂的刪除:");

for (int i = 0; i < hp->size; i++)

printf("\n");

//堆排序

heapsort(hp);

printf("\n");

system("pause");

return 0;

}

6.測試截圖

堆的建立,插入,刪除,排序

堆是一種完全二叉樹,有最小堆和最大堆之分,最小堆是指根節點的值一定小於左子樹和右子樹所有元素的值,最大堆則相反 當你從小到大排序時,可以選擇最小堆反之,則選擇最大堆 1.如何建立乙個最小堆呢 由於堆是乙個完全二叉樹,所以滿足以下關係 我們將元素的順序從0開始排,第i個節點稱之為ki,那麼元素就有k0...

資料結構 堆(建立,插入,刪除,排序)

關於二次總結是否有必要,我覺得是有的,參考學習別人的知識,內化的過程是一次總結的過程。每次參考同乙個人的思維軌跡,確實能培養思維。該篇筆記整理理由 在pat advanced level的heap path一題,參考了關於堆的正序遍歷的映象。於是參考一下堆相關筆記。void createheap v...

堆的建立,插入,刪除

堆的概念 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且ki k2 i 2 i 0,1,2 則稱這個堆為最小堆 或者最大堆 其實這麼多乾乾的概念還是很不好理解的 先來說一下什麼是完全二叉樹 如果一顆具有n個結點的二叉樹的結構與滿...