主要思想:在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。不如先假設第一次讀取的資料...