> 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 題意 每輸入奇數個數字,實時輸出中位數 解題思路 定義乙個對頂堆,輸入第乙個數字,並作為中位數輸出,每輸入乙個數...