資料結構 堆及堆的應用

2021-08-15 19:11:56 字數 3838 閱讀 3468

>  1. 堆:把一組資料按照完全二叉樹的順序儲存模式儲存在乙個二維陣列中,

> 若ai> 若ai>ai+1&&ai>ai+2,則稱為大堆(i=0,1,2...n);

在堆中,若設父親節點為parent,則它的左孩子為2*parent+1,右孩子為2*parent+2;

void makeheap(datatype* a, size_t n)//構建堆

}

- 向下調整函式:

void adjustdown(datatype* a, size_t n, int root)//向下調整

if(a[child]parent])

else}}

void adjustup(datatype* a, size_t n, int child)//向上調整 

else}}

堆的應用:

1、海量資料top k問題:

void topk(datatype* a, size_t n, size_t k)

for(i=0

;i}

2、優先順序佇列問題

初始化

void priorityqueueinit(priorityqueue* q)

void

priorityqueuepush(priorityqueue* q, datatype x)

q->_a[q->_size++]=x;

adjustup(q->_a,q->_size,q->_size-1);//從最後乙個元素開始調

}

void

priorityqueuepop(priorityqueue* q)

q->_a[0]=q->_a[q->_size-1];

q->_size--;

adjustdown(q->_a,q->_size,0);

}

- datatype priorityqueuetop(priorityqueue* q)

return q->_a[0];

}

size_t priorityqueueempty(priorityqueue* q)

3、堆排序

void heapsort(datatype* a, size_t n)

}

原始碼:

heap.h

#ifndef __heap_h_

#define __heap_h_

#include

#include

#include

typedef int datatype;

void adjustdown(datatype* a, size_t n, int root) ;//向下調整

void makeheap(datatype* a, size_t n) ;//構建堆

void adjustup(datatype* a, size_t n, int child);//向上調整

// topk 最大的前k

void topk(datatype* a, size_t n, size_t k);

#define n 1000

typedef struct priorityqueue

priorityqueue;

void priorityqueueinit(priorityqueue* q);

void priorityqueuepush(priorityqueue* q, datatype x);

void priorityqueuepop(priorityqueue* q);

datatype priorityqueuetop(priorityqueue* q);

size_t priorityqueuesize(priorityqueue* q);

size_t priorityqueueempty(priorityqueue* q);

void heapsort(datatype* a, size_t n) ;

#endif

heap.c

#include"heap.h"

void makeheap(datatype* a, size_t n)//構建堆

}void adjustdown(datatype* a, size_t n, int root)//向下調整

if(a[child]2*parent+1;

}else

}}void adjustup(datatype* a, size_t n, int child)//向上調整

else

}}void topk(datatype* a, size_t n, size_t k)

for(i=0;i"%d ",a[i]);

}}void priorityqueueinit(priorityqueue* q)

void priorityqueuepush(priorityqueue* q, datatype x)

q->_a[q->_size++]=x;

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

}void priorityqueuepop(priorityqueue* q)

q->_a[0]=q->_a[q->_size-1];

q->_size--;

adjustdown(q->_a,q->_size,0);

}datatype priorityqueuetop(priorityqueue* q)

return q->_a[0];

}size_t priorityqueuesize(priorityqueue* q)

size_t priorityqueueempty(priorityqueue* q)

void heapsort(datatype* a, size_t n)

}

test.c

#include"heap.h"

void testheap()

; heaapsort(a,sizeof(a)/sizeof(a[0]));

printf("\n");

makeheap(a, sizeof(a)/sizeof(datatype));

srand(time(0));

for (i = 0; i < 1000; ++i)

narray[30] = 10001;

narray[350] = 10002;

narray[999] = 10003;

narray[158] = 10004;

narray[334] = 10005;

topk(narray, 1000, 5);

} void testpriorityqueue()

printf("\n");

} int main()

資料結構 堆及堆的應用

堆是一種特殊的樹形結構,堆的把每乙個節點都有乙個值,我們通常所說的堆這種資料結構,指的就是二叉堆。其實它可以被看做乙個完全二叉樹。它的每個節點的子樹又可以被看做是堆。堆可以分為最大堆和最小堆 最大堆 每個父節點都大於孩子節點 最小堆 每個父節點都小於孩子節點 a 我們在定義堆的資料成員的時候,利用s...

資料結構 堆的應用

public class heap 插入操作的 public void insert int value count a count value 插入後,從節點開始從下往上開始堆化,插入 自下往上堆化 int i count while i 2 0 a i a i 2 public int remo...

資料結構綜合應用 堆

動態維護中位數問題,可以用堆,樹狀陣列,線段樹等資料結構解決 堆,可以用來進行插入,查詢最值,刪除最值等操作 對頂堆 一大根堆和一小根堆,大根堆維護最小值,小根堆維護最大值。洛谷1168 題意 每輸入奇數個數字,實時輸出中位數 解題思路 定義乙個對頂堆,輸入第乙個數字,並作為中位數輸出,每輸入乙個數...