堆的簡單應用

2021-07-12 05:30:17 字數 1765 閱讀 5708

一、大資料的處理

給出n個資料,要求找到並輸出這n個數裡面最大的k個數

思路:利用堆,先建乙個開闢乙個大小為k的陣列,從n個資料裡拿出k個資料放到堆裡面,然後再通過向

下調整法把堆調整為最小堆,此時陣列的第乙個元素就是堆裡面最小的元素,然後在剩下的n-k個

資料中依次和堆裡面最小的資料進行比較,若比第乙個元素大,則交換兩個的值,每交換一次就向下調

整一次,保證在最上面的是最小元素,這樣一直到所有資料比較完畢,此時堆裡面儲存的k個資料就是最

大的k個資料。

下面是實現**

#include#includeusing namespace std;

//1.在n個資料當中找出最大的k個數

const int n = 10000;

const int k = 100;

void adjustdown1(int a, int size, int parent)  //建乙個小堆

if (a[child] < a[parent])

else

}}void gettopk(int a,int topk)

//建堆

for (j = (k - 2) / 2; j >0; --j)

for (int m = 0; m < n; ++m) }

for (int n = 0; n < k; ++n)  //一次輸出k個最大數

cout << endl;

}

測試**

#include"bigdata.h"

void testtopk()

gettopk(a, topk);

}int main()

測試結果

為了便於除錯,我用的測試栗子比較簡單,大家可以嘗試一下更一般的栗子哦~

二.堆排序

思路:利用堆,建乙個最大堆,每次選出最大的資料與陣列末尾的資料進行交換,然後再進行一次向下

調整變成最大堆,始終保持最上面的為當前最大的資料,假設陣列由n個資料,則下次就讓第乙個資料與

陣列的第n-1個資料作比較,因為第n個資料已經是最大的了,每交換一次要調整一次,這樣當比較到第

乙個資料時這個堆就是乙個有序的了。

實現**如下:

//2.堆排序:建大堆,每次找到最大的資料交換到陣列末尾,將剩下的資料adjustdown,再進行交換

void adjustdown2(int a,int size,size_t parent)

else

}}void heap_sort(int a, size_t n)

for (int i = 0; i < n; ++i)

for (int i = 0; i < n; ++i)

cout << endl;

}

測試**:

void testheap_sort()

; heap_sort(a, 10);

}int main()

測試結果:

以上便是堆的兩種簡單應用啦,不足之處還請大家指出哦~

堆的簡單實現和應用

一 用陣列儲存的堆和由此堆上實現的簡單排序。雖然對排序保證了最壞情況下的o n log n 的效能,但對於常見輸入,最快的堆排序也比簡單快速排序慢。1 include2 using namespace std 3int x 100 4 void siftup intn 5 17 18void sif...

堆以及堆的相關應用

本文中的堆是一種樹形資料結構,可以把堆看成一種特殊的完全二叉樹,再從二叉樹上加上一些限制條件即可以構成堆。即要求父節點元素全部都大於或等於子節點元素,或者小於等於。這就構成了倆種堆 堆的常見應用為 使用堆進行排序,也就是常說的堆排序,時間複雜度為nlgn 這是比較排序時間複雜度的下限,即使用比較的排...

堆以及堆的實際應用

1.堆的概念 堆的儲存可以看成是陣列儲存的變形,不過,堆的儲存又具有二叉樹的結構,堆的儲存按型別可以分為大堆和小堆。小堆 大堆 中 任一節點的關鍵碼均小於 大於 等於它的左右孩子的關鍵碼,位於堆頂節點的關鍵碼最小 最大 從根節點到每個結點的路徑上陣列元素組成的序列都是遞增 遞減 的。2.堆的建立 堆...