求陣列中的topk數字,比如【1、4、6、7、2、9、8、3、5、0】的top4是【6、7、8、9】。
用小頂堆來實現,
**如下,minheap.cpp:
#include
#include
using
namespace
std;
class minheap ;
minheap::minheap(int k)
/** * 建立小頂堆
*/void minheap::createminheap(int a)
for(int i = arr.size() / 2 - 1; i >= 0; i--)
}/**
* 插入元素
*/void minheap::insert(int val)
}/**
* 向下調整
*/void minheap::filterdown(int current)
}arr[current] = val;
}/**
* 獲取堆頂元素
*/int minheap::gettop()
/**
* 獲取堆中的全部元素
*/vector
minheap::getheap()
int main() ;
int k = 4;
minheap heap(4); // 建立乙個大小為4的堆
heap.createminheap(arr);
for(int i = k; i < 10; i++)
cout
<< "最大的四個元素是"
<< endl;
vector
v = heap.getheap();
for(int i = 0; i < v.size(); i++)
return
0;}
執行結果是:
參考:topk 堆排序 小頂堆
問題描述 假設需要我們在一堆海量資料中找出排名前k的資料 最好的方法是用最小堆排序,直接用前k個資料建立乙個小頂堆,然後遍歷剩餘的數,如果此數 堆頂的數,則將此數和堆頂的數交換,然後從堆頂向下調整堆,使其重新滿足小頂堆。說明 堆的儲存 一般用陣列來表示堆,第i個節點的父節點下標為i 2 1 它的左右...
堆排序以及TopK大頂堆小頂堆求解方式(js版)
堆排序是一種選擇排序,時間複雜度o nlogn 空間複雜度o 1 資料結構底層是陣列,通過索引之間的關係可看二叉樹,父結點總是大於或者小於孩子結點。這就是堆的結構。剛初始完的堆是佔據整個陣列的。開始排序後,陣列分為兩個部分!前面是堆,後面是已排序完的有序子陣列。排序時,堆頂元素和堆尾元素會交換,有序...
大頂堆小頂堆
堆通常是乙個可以被看做一棵完全二叉樹的陣列物件 如果對一棵有n個結點的完全二叉樹的結點按層序編號 從第1層到第 1層,每層從左到右 則對任一結點i 1 i n 有 1 如果i 1,則結點i無雙親,是二叉樹的根 如果i 1,則其雙親是結點。2 如果2i n,則結點i為葉子結點,無左孩子 否則,其左孩子...