C 小頂堆求Topk

2021-08-09 09:10:39 字數 1162 閱讀 4793

求陣列中的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為葉子結點,無左孩子 否則,其左孩子...