堆在邏輯上是一顆完全二叉樹,一般採用順序表儲存的方式。 當然這裡的堆和記憶體中的堆毫無關係,只不過是名字恰好相同。
其有大堆和小堆之分:
一、大堆:任一結點資訊均大於等於它左右孩子的資訊,位於堆頂結點的資訊最大,從根節點到每個結點路徑 上陣列元素組成的序列都是遞增的。
二、小堆 任一結點資訊均小於等於它左右孩子的資訊,位於堆頂結點的資訊最小,從根節點到每個結點路徑 上陣列元素組成的序列都是遞減的。
如果 i=0為根節點,如有左孩子,則左孩子結點為 2*i+1。
如果 i=0為根節點,如有左孩子,則左孩子結點為 2*i-1。
如果結點 i , 有雙親結點,則雙親結點為 (i-1)/2。
接下來給出堆的相關操作,如建堆,插入,刪除等。
#pragma once
#include #include #include #include typedef struct heapheap;
void swap(int *partent, int *child)
void init(heap *ph, int array, int size)
//將乙個雙親結點,向下調整遞迴建大堆
void adjustdownrecursion(heap *ph, int parent)
max = left;
if (rightsize&&ph->array[right]>ph->array[left])
if (ph->array[parent] > ph->array[max])
swap(ph->array + parent, &(ph->array[max]));
adjustdownrecursion(ph, max);
}//將乙個雙親結點向下調整,迴圈建大堆
void adjustdownloop(heap *ph, int parent)
max = left;
if (right > ph->size&&ph->array[right] > ph->array[left])
if (ph->array[parent] > ph->array[right])
swap(ph->array+parent, &(ph->array[right]));
parent = max; }}
void heapmake(heap *ph)
}int heaptop(heap *ph)
int heapsize(heap *ph)
int heapisempty(heap *ph)
//刪除堆頂元素
assert(ph);
assert(ph->size > 0);
ph->array[0] = ph->array[ph->size - 1];
adjustdownloop(ph, 0);
}//將乙個孩子結點向上調整,建大堆
void adjustup(heap *ph, int child)
if (ph->array[parent] >= ph->array[child])
swap(ph->array + parent, ph->array + child);
child = parent; }}
//插入元素,每插入乙個向上調整一次
void heapinsert(heap *ph, int data)
//對數組建大堆,調整root
void adjustdownarray(int array, int size, int root)
max = left;
if (rightleft)
if (array[right] < array[parent])
swap(array+parent,array+max);
parent = max; }}
// 在 array 中找到最小的 k 個數
int * topk(int array, int size, int k)
for (i = (k - 2) / 2; i <= 0; i--)
for (i = k; i < size; i++)
} return arr;
}void heapsortright(int array, int size)
for (i = 0; i < size; i++)
}void heapsortwrong(int array, int size) }}
void test()
; int size = sizeof(array) / sizeof(int);
init(&heap, array, size);
heapmake(&heap);
for (int i = 0; i < heap.size; i++)
printf("\n");
printf("heap\n");
}
資料結構中的堆
堆排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即a parent i a i 在陣列的非降序排序中,需要使用的就是大根...
資料結構 堆中的路徑
7 9 堆中的路徑 25 分 將一系列給定數字插入乙個初始為空的小頂堆h。隨後對任意給定的下標i,列印從h i 到根結點的路徑。每組測試第1行包含2個正整數n和m 1000 分別是插入元素的個數 以及需要列印的路徑條數。下一行給出區間 10000,10000 內的n個要被插入乙個初始為空的小頂堆的整...
資料結構 堆
最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...