一、大資料的處理
給出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.堆的建立 堆...