堆分為兩種:最大堆和最小堆
最大堆:父節點的值比每乙個子節點的值都要大。
最小堆,父節點的值比每乙個子節點的值都要小。
heap實現:
heap.h
heap.c#include #include #include #include #include typedef int hpdatatype;
typedef struct heap
heap;
void heapinit(heap* hp, hpdatatype* a, size_t n);
void heapdeatory(heap* hp);
hpdatatype heaptop(heap* hp);
int heapsize(heap* hp);
int heapempty(heap* hp);
void adjustdown(hpdatatype* a, size_t n, int root);
void swap(int* a, int* b);
void heapsort(int* a, int n);
void heaptest();
void topk();
#define _crt_secure_no_warnings 1
#include "heap.h"
void adjustdown(hpdatatype* a, size_t n, int root)
}void heapdeatory(heap* hp)
void adjustup(hpdatatype* a, size_t n, size_t child)
else
}} hp->_array[hp->_size] = x;
hp->_size++;
//調堆
adjustup(hp->_array, hp->_size, hp->_size - 1);
}hpdatatype heaptop(heap* hp)
int heapsize(heap* hp)
int heapempty(heap* hp)
void swap(int* a, int* b)
void heapsort(int* a, int n)
int end = n - 1;
while (end > 0) }
void topk()
a[6] = 100001;
a[7] = 100003;
a[9] = 100004;
a[22] = 100008;
a[88] = 100007;
a[79] = 100006;
a[46] = 100005;
a[99] = 100004;
a[55] = 100002;
a[100] = 100009;
heap hp;
heapinit(&hp, a, k);
for (size_t i = k; i < n; i++) }
} printf("\n");
}int main()
; heap hp;
heapinit(&hp, a, sizeof(a) / sizeof(int));
//topk();
heapsort(a, sizeof(a) / sizeof(a[0]));
heapdeatory(&hp);
system("pause");
return 0;
}
資料結構 堆(heap)
堆 heap 也被稱為優先佇列 priority queue 佇列中允許的操作是先進先出 fifo 在隊尾插入元素,在隊頭取出元素。而堆也是一樣,在堆底插入元素,在堆頂取出元素,但是堆中元素的排列不是按照到來的先後順序,而是按照一定的優先順序排列的。這個優先順序可以是元素的大小或者其他規則。如圖一所...
資料結構 堆 heap
陣列表示 公式運算 堆就是用陣列實現的完全二叉樹,所以它沒有使用父指標或者子指標。堆根據 堆屬性 來排序,堆屬性 決定了樹中節點的位置。堆的根節點中存放的是最大或者最小元素,但是其他節點的排序順序是未知的。例如,在乙個最大堆中,最大的那乙個元素總是位於 index 0 的位置,但是最小的元素則未必是...
C 資料結構 堆 Heap 的實現
現在有乙個陣列,邏輯上可看做一棵完全二叉樹.堆 heap 就是用陣列實現的完全二叉樹 堆分為兩種 大根堆和小根堆 在大根堆中,父節點的值比每乙個子節點的值都要大 在小根堆中,父節點的值比每乙個子節點的值都要小 這裡將用 建立乙個小根堆 如下 標頭檔案heap.h pragma once includ...