堆的基本操作

2021-09-02 05:23:27 字數 3010 閱讀 1406

heap.h

#ifndef __heap_h_

#define __heap_h_

//定義乙個函式指標

//typedef int (*pf)(hdatatype left, hdatatype right);

typedef int hdatatype;

typedef struct heap

heap;

//int greater(hdatatype left, hdatatype right);

//int less(hdatatype left, hdatatype right);

void heapinit(heap*hp, int*arr, int size);//堆的初始化

hdatatype heaptop(heap*hp);//獲取堆頂元素

void _checkcapacity(heap*hp);//檢測容量

void heapinsert(heap*hp, hdatatype data);//插入

int heapempty(heap*hp);//判斷堆是否為空

void heapdestory(heap*hp);//堆的銷毀

void heaperase(heap*hp);//刪除堆頂元素

void heapsort(int*arr,int size);//堆排序

#endif

heap.c

#include"heap.h"

#include#include#includevoid swap(hdatatype* x, hdatatype* y)

//int greater(hdatatype left, hdatatype right)

////

//int less(hdatatype left, hdatatype right)

////向下調整

void adjustdown(int parent, hdatatype*array, int size)

} //將左右孩子中較小的那乙個與父節點進行比較,若比父節點還小,則要交換(把父節點調整下來)

if (array[parent] > array[child])

else

} }//堆的初始化

void heapinit(heap*hp, int*arr, int size)

//將陣列元素全部拷貝進堆空間

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

hp->_capacity = size;

hp->_size = size;

//調整元素位置,使之成為堆

//從最後乙個非葉子節點依次調整

int root = (size - 1) / 2;

for (root; root>=0; root--)

}//獲取堆頂元素

hdatatype heaptop(heap*hp)

//檢測容量

void _checkcapacity(heap*hp)

hp->_capacity = new_capacity; }}

//向上調整演算法

//思路:因為前提已經是乙個堆了,插入元素在最後插入,所以只需要調整插入位置依次往上的子樹,直到根節點也滿足

void adjustup(int child, hdatatype*array, int size)

//判斷堆是否為空(為空返回1,不為空返回0)

int heapempty(heap*hp)

//堆的銷毀

void heapdestory(heap*hp)

//刪除堆頂元素

void heaperase(heap*hp)

//不為空,

//思路:將堆頂元素與堆的最後乙個元素交換(即堆頂元素換到最後),然後size--,就刪掉了堆頂元素

//刪掉後,堆的結構可能被破壞,所以再向下調整

//hdatatype top=heaptop(hp);

swap(&(hp->_array[0]), &(hp->_array[hp->_size - 1]));

hp->_size--;

adjustdown(0, hp->_array, hp->_size);

}//列印堆

}void heapadjust(int root, int*arr, int size)

} //將最小值與當前子樹的根節點進行比較,若小於子樹根節點,則資料進行調換

if (arr[root] > arr[child])

else

}}//堆排:降序(建小堆)

void heapsort(int*arr, int size)

//2.把堆頂元素和最後乙個元素調換,然後刪除最後乙個元素(不能用size--);再開始向下調整

int end = size - 1;//用end標記尾元素下標,每次排好乙個後,end--,繼續排其他元素

while (end)

}

test.c

#include"heap.h"

#include#includeint main()

; //int arr = ;

heap hp;

heapinit(&hp, arr, 6);

heapdestory(&hp);

//heapsort(arr, sizeof(arr) / sizeof(arr[0]));

/*printf("\n");

heapinsert(&hp, 11);

printf("\n");

heapbubble(&hp);

//int ret = heapempty(&hp);

//printf("ret=%d\n", ret);

/*heaperase(&hp);

heaperase(&hp);

system("pause");

return 0;

}

堆的基本操作

堆的基本概念 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱為小堆 或大堆 如下圖 分別為小堆和大堆 堆的操作具體 如下 測試環境 vs201...

堆的基本操作

堆的資料結構 對於堆,有最大堆和最小堆,在定義乙個堆的時候用乙個陣列表示堆,同時為了方便定義堆的大小,用乙個 size 表示堆的有效元素,同時為了區別最大堆和最小堆,我們用乙個函式指標表示這個堆是最大堆還是最小堆.typedef int compare heaptype parent,heaptyp...

堆的基本操作

堆 邏輯上是一顆完全二叉樹 物理上是陣列的形式 順序儲存 作用 找陣列中的前k大的值 特點 大頂堆 任意乙個root的值 左右子樹的值 小頂堆 任意乙個root的值 左右子樹的值 要調整root所在的節點 前提 root的左右子樹都已滿足堆的性質 如果root所在的節點已經是葉子結點,調整結束 找到...