資料結構與演算法 資料結構C 堆

2021-08-25 14:21:55 字數 3268 閱讀 4066

資料結構c_堆

如果有乙個關鍵碼的集合k = ,把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足:

ki <= k2*i+1 且 ki<= k2*i+2 (ki >= k2*i+1 且 ki >= k2*i+2) i =0,1,2…,則稱為小堆(或大堆)。

小堆(大堆)中:任一結點的關鍵碼均小於(大於)等於它的左右孩子的關鍵碼,位於堆頂結點的關鍵碼最小(最大),從根節點到每個結點的路徑上陣列元素組成的序列都是遞增(遞減)的。

堆儲存在下標為0開始的陣列中,因此在堆中給定下標為i的結點時:

如果i=0,結點i是根節點,沒有雙親節點;否則結點i的雙親結點為結點(i-1)/2

如果2 * i + 1 <= n - 1,則結點i的左孩子為結點2 * i + 1,否則結點i無左孩子

如果2 * i + 2 <= n - 1,則結點i的右孩子為結點2 * i + 2,否則結點i無右孩子

將二叉樹調整為最小堆的原理:

從最後乙個非葉子結點開始調整,一直到根節點為止,將每個結點及其子

樹調整到滿足小堆的性質即可

堆的插入:在已經建成的最小堆的後面插入新元素,插入之後,當樹中結點不滿足堆的性質時,就需要對堆進行重新調整

堆的刪除:刪除時每次刪除堆頂元素

實現堆的一系列操作:

標頭檔案:heap.h

#pragma once

#include #include #include #include typedef int hpdatatype;

typedef struct heap

heap;

//堆的初始化

void heapinit(heap* hp, hpdatatype* a, int n);

//堆的銷毀

void heapdestory(heap* hp);

//堆的插入

//堆的刪除

//訪問堆頂

hpdatatype heaptop(heap* hp);

//堆的大小

int heapsize(heap* hp);

//判斷堆是否為空

int heapempty(heap* hp);

//堆的排序

int heapsort(hpdatatype* a, int n);//不要直接調heap

//向下調整

void adjustdown(hpdatatype* a, int n, int root);

//向上調整

void adjustup(heap* hp, int child);

//交換

void swap(hpdatatype* a, hpdatatype* b);

//列印

void testheap();

原始檔:heap.c

#include"heap.h"

//交換

void swap(hpdatatype* a, hpdatatype* b)

//堆的初始化

void heapinit(heap* hp, hpdatatype* a, int n)

for (i = (n - 2) / 2; i >= 0; --i) }

//向下調整

void adjustdown(hpdatatype* a, int n, int root)

else

break; }}

//向上調整

void adjustup(hpdatatype* a, int n, int child)

else

break; }}

//堆的銷毀

void heapdestory(heap* hp)

//堆的插入

hp->_a[hp->_size] = x;

hp->_size++;

int child;

child = (int)hp->_size - 1;

adjustup(hp->_a, hp->_size, hp->_size - 1);

}//堆的刪除

//訪問堆頂

hpdatatype heaptop(heap* hp)

//堆的大小

int heapsize(heap* hp)

//判斷堆是否為空

int heapempty(heap* hp)

else

printf("堆不為空\n");

}//堆的排序

int heapsort(hpdatatype* a, int n) //不要直接調heap

end = n - 1;

while (end > 0)

--end;

}//列印

printf("\n");

}

測試:test.c

#include "heap.h"

void testheap()

; int n = sizeof(a) / sizeof(a[0]);

heapinit(&hp, a, n);

printf("初始化:");

printf("插 入:");

printf("堆大小:%d\n", heapsize(&hp));

printf("取堆頂:%d\n", heaptop(&hp));

printf("刪 除:");

printf("判 空:");

heapempty(&hp);

printf("堆大小:%d\n", heapsize(&hp));

printf("取堆頂:%d", heaptop(&hp));

printf("\n");

}int main()

資料結構與演算法 資料結構之棧

棧的英文名是stack 棧的應用場景 表示式的轉換 中綴表示式轉字尾表示式 與求值 實際解決 二叉樹的遍歷。圖形的深度優先 depth一first 搜尋法。package org.yc public class test class arraystack boolean isfull return ...

資料演算法 資料結構與演算法

資料結構和演算法的意義?資料結構是資料的組織方式,演算法是對資料的處理方式,合理的資料結構和演算法,能夠保證程式高效的執行。演算法的五大特性 輸入 演算法具有0個或多個輸入 輸出 演算法具有1個或多個輸出 確定性 演算法每一步有確定的含義,不能有二義性 可行性 演算法有限次完成 演算法的評價方式?演...

演算法(資料結構)

空間不夠儲存 給40億個不重複的unsigned int的整數,沒排過序的,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中 40億個數空間儲存的問題 利用對映 分析 unsigned 範圍是2 32 40億大約大約4g個數不到,常規方法肯定是不行的 我們你可以利用 伴隨陣列 那種思想利用記...