堆排序 在n個數中找出K個最大的數

2021-08-22 02:28:59 字數 2704 閱讀 6817

主要思想:在n個數中找k個最大(小)的數,肯定要用到最小堆、最大堆的思想,而這種思想在c中stl中的優先佇列(priority_queue)中體現比較明顯,優先佇列底層實現就是運用了最大堆、最小堆原理,如果要求用c實現的話,可以直接用。如果用c語言實現的話,就需要自己定於堆的一系列操作,自己實現最大堆、最小堆。

實現一:c++實現

直接呼叫stl中的priority_queue.

vectorsearch_max_k(vectorvec,int k)

} vectorresult;

while (!que.empty())

return result;

}

注:stl中的堆的使用方法

stl裡面的堆操作一般用到的只有4個:make_heap();、pop_heap();、push_heap();、sort_heap(); 他們的標頭檔案函式是#include

(1)make_heap();函式原型是:void make_heap(first_pointer,end_pointer,compare_function);

乙個引數是陣列或向量的頭指標,第二個是陣列或向量的尾指標(注意這裡是尾後指標或尾後迭代器,而不是最後乙個元素的位址)。第三個引數是比較函式,在預設的時候,預設是大跟堆(注意如果要自定義比較函式話:最大堆用小於函式;最小堆用大於函式)。

作用:把這一段的陣列或向量做成乙個堆的結構。堆的範圍是[first,last) 注意不包括last尾後指標或尾後迭代器

(2)pop_heap();函式原型是:void pop_heap(first_pointer,end_pointer,compare_function);

作用:pop_heap()不是真的把最大(最小)的元素從堆中彈出來。而是重新排序堆。它把first和last-1這兩個堆元素交換位置,然後將[first,last-1)的之間的元素做成乙個堆,不包括last-1。

(3)push_heap();函式原型是: void pushheap(first_pointer,end_pointer,compare_function);

作用:push_heap()假設由[first,last-1)是乙個有效的堆,然後,再把堆中的新元素last-1加進來,做成乙個堆,堆的範圍變成[first,last)。

(4)用的不多。sort_heap();函式原型是:void sort_heap(first_pointer,end_pointer,compare_function);

作用:sort_heap對[first,last)中的序列進行排序。它假設這個序列是有效堆。(當然,經過排序之後就不是乙個有效堆了)

link

link

實現二:c語言實現

手動實現最小堆所有操作(堆的插入、刪除、調整、建立等操作)

主要的函式:

vectorget_max_k(vectorvec, int k)

} vectorresult(num_k.begin(), num_k.begin()+k);

return result;

}

定義的子函式:

#include#include#include#include#include#includeusing namespace std;

//hash_mapf_ip;

void heapadjust(int *heap, int top, int n);

vectorsearch_max_k(vectorvec,int k)

return result;

}//自己寫最小堆進行實現,其中包括插入、刪除、調整等子操作

//堆的插入

/** 堆插入演算法。(小頂堆)

* 先將num插入堆尾,易知從新資料的父結點到根結點是乙個有序的序列,

* 將num插入到該有序序列當中,該過程為直接插入排序。

* 未插入前資料長度為n。

*/void heapinsert(int *heap, int n, int num)

heap[i] = num;

}//堆元素的刪除

/** 堆刪除演算法。(刪除堆頂元素)

* n表示未刪除前堆中資料的總數。

*/void heapdelete(int *heap, int n)

/** 堆調整演算法。(小頂堆)

* 已知heap[top]結點的左右子樹均為堆,調整堆中元素,使以heap[top]為根結點的樹為堆。

* n為堆中元素總數。

*/void heapadjust(int *heap, int top, int n)

heap[top] = temp;

}//堆的建立

/** 建堆演算法。

* 將無序陣列array轉換為堆。

*/void creatheap(int *array, int n)

}vectorget_max_k(vectorvec, int k)

} vectorresult(num_k.begin(), num_k.begin()+k);

return result;

}int main()

; vectorvec(a,a+12);

//vectorresult = search_max_k(vec, 4);

vectorresult = get_max_k(vec, 4);

return 0;

}

找出N個資料中的最大的K個資料 堆排序

從n個資料中找出最大的k個資料,而且這裡有乙個限制 記憶體裡存不下所有的n個資料,但是可以存下k個資料。這就讓我們打消了用排序的方法來解的念頭。在這裡我們使用堆排序來完成。因為我們只能有k個資料那麼大的空間,所以我們建乙個k大的堆,將n的前k個資料插入到堆中,然後調整堆。對於堆結構不了解的可以檢視我...

N個數中找出最大的K個數

題目描述 有很多個 n個 無序的數,我們姑且假定它們各不相等,怎麼選出其中最大的若干個 k個 數呢?1.n 100,k 10的時候怎麼處理?2.n 1000,k 100呢?3.n 1億億個,k 100呢?如果這些數是整數的話,怎麼處理?如果是浮點數呢?如果這些數是整數,並且存在上界呢?如果將題目中的...

N個數裡面找出最大的k個數

出處 題目 給出n個無序的數,然後找出其中最大的k個數 解題思路 首先測試資料有可能會有一億個數,資料量特別的大,資料庫不可能儲存這麼多的資料。如果直接sort排序,nlogn時間複雜度實在是太高,大於10 9。我們可以考慮對資料進行分塊讀取,每次讀取的資料塊大小應大於k。不如先假設第一次讀取的資料...