資料結構 堆

2021-08-15 19:04:12 字數 1636 閱讀 8048

資料太大,建堆時記憶體不足,可以建包含k個數的最小堆,然後後面的數依次與堆頂比較大小,比堆頂大的數就替換堆頂的數,然後向下排序,這樣可以一直得到k個數是所有比較過的數中是最大的。

函式實現

#define n 1000 

typedef int datatype;

void adjustdown(datatype* a, size_t n, int root) //小堆

if (a[root] > a[child])

else

}}void makeheap(datatype* a, size_t n)

}void adjustup(datatype* a, size_t n, int child) //小堆

else

}}// topk 最大的前k

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

}for (i = 0

; i < 5; i++)

printf("\n");

}

測試用例

void testheap()

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

datatype narray[1000];

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);

}

入佇列時可以隨便入,出佇列時,優先順序最高的先出

介面實現

typedef struct priorityqueue

priorityqueue;

void

priorityqueueinit(priorityqueue* q)

void

priorityqueuepush(priorityqueue* q, datatype x)

else

}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)

}

測試用例

void testpriorityqueue()

printf("\n");

//while (priorityqueueempty(&q) != 0)

////printf("\n");

}

資料結構 堆

最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...

資料結構 堆

資料結構 堆的操作和實現 當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全 除最底層 外都是滿的 二叉樹,並滿足如下條件 1 根結點若有子樹,則子樹一定也是堆。2 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...

資料結構 堆

堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...