您好,登錄后才能下訂單哦!
/***************************** 復雜度:
***************************/ #include<iostream> #include<assert.h> #include<vector> #include<stdlib.h> #include<time.h> using namespace std; #define N 1000 #define K 100 void AdjustDown(int *a, size_t root, size_t size) { //向下調整小堆 size_t parent = root; size_t child = parent * 2 + 1; while (child < size) { if (child + 1 < size && a[child] > a[child + 1]) { ++child; } if (a[parent] > a[child]) { swap(a[parent], a[child]); parent = child; child = parent * 2 + 1; } else//注意不滿足交換條件時跳出本次循環 { break; } } } void GetTopk(const vector<int>& Vnumber, int n, int k)//N個數中找最大的前k個數--小堆實現 { assert(n>k); int *TopkArray = new int[k];//通過前k個元素建立含有k個元素的堆 for (size_t i = 0; i < k; i++) { TopkArray[i] = Vnumber[i]; } for (int i = (k - 2) / 2; i >= 0; --i)//建小堆 { AdjustDown(TopkArray, i, k); } //從第k個元素開始到第n個元素分別與堆頂元素進行比較,較大數據入堆頂,再對整個堆進行下調,使堆頂存放最小元素(小堆) for (size_t i = k; i < n; ++i) { if (Vnumber[i] > TopkArray[0]) { TopkArray[0] = Vnumber[i]; AdjustDown(TopkArray, 0, k); } } size_t count = 0; for (size_t i = 0; i < k; ++i)//打印k個最大數據,即堆中所有元素 { cout << TopkArray[i] << " "; ++count; if (count % 10 == 0) { cout << endl; } } cout << endl; delete[] TopkArray;//注意釋放TopkArray所占的內存 TopkArray = NULL; } void CreateVnumber(vector<int>& Vnumber)//創建N個數 { srand((unsigned int)time(NULL)); //srand(time(0)); Vnumber.reserve(N); for (size_t i = 0; i<N; i++) { Vnumber.push_back(rand() % 1000);//產生N個隨機值 } for (size_t i = K; i < N; ++i) { Vnumber[i] *= 100; } } int main() { vector<int> Vnumber; CreateVnumber(Vnumber); GetTopk(Vnumber, N, K); //int length = Vnumber.size(); //for(int i=0;i<length;i++) //{ // cout<<Vnumber[i]<<" "; // } return 0; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。