資料結構中的堆

2021-08-22 02:51:02 字數 2448 閱讀 8829

堆在邏輯上是一顆完全二叉樹,一般採用順序表儲存的方式。   當然這裡的堆和記憶體中的堆毫無關係,只不過是名字恰好相同。

其有大堆和小堆之分:

一、大堆:任一結點資訊均大於等於它左右孩子的資訊,位於堆頂結點的資訊最大,從根節點到每個結點路徑 上陣列元素組成的序列都是遞增的。

二、小堆  任一結點資訊均小於等於它左右孩子的資訊,位於堆頂結點的資訊最小,從根節點到每個結點路徑 上陣列元素組成的序列都是遞減的。

如果 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個節點...