輸入n個整數,求出最小的K個數字

2021-09-13 04:15:12 字數 1548 閱讀 8635

該問題我們可以先維護乙個大小為k的陣列karr,然後遍歷n個整數,當某個值比karr的最大的還要小時,就更新該陣列。**如下:

#include

#include

#include

#include

using namespace std;

void display(int intarr, int length)

cout << endl;

}int getmin(int intarr, int length)//獲取維護陣列的最大值

}return maxi;

}int getmink(int intarr, int length, int k)

for (int i = 0; i < length; i++)

}return mink;

}int main()

display(intarr, 20);

int *mink = getmink(intarr, 20, 5);

sort(intarr, intarr + 20);

display(intarr, 20);

display(mink, 5);

system(「pause」);

return 0;

}在c++的演算法中,我們可以採用大小堆來求出最小的k個數字。c++的stl中已經提供了的multiset的容器,該容器預設從小到大排序,而且可以放重複資料。我們直接拿過來用即可。

#include

#include

#include

#include

#include

#include

using namespace std;

void findmink(multiset&intheap, int intarr, int length, int k)

else}}

}int main()

/display(intarr, 20);

int *mink = getmink(intarr, 20, 5);

sort(intarr, intarr + 20);

display(intarr, 20);

display(mink, 5);

*/display(intarr, 20);

sort(intarr, intarr + 20);

display(intarr, 20);

findmink(intheap, intarr, 20, 5);

for (auto x : intheap)

cout << endl;

system(「pause」);

return 0;

}大頂堆的演算法時間複雜度明顯小於第一種演算法,第一種每一次遍歷乙個資料都需要查詢k次,那麼對n的陣列來說,那麼複雜度為nk。

但是由於大頂堆在內部實現上是二叉樹實現,每次查詢就是二叉樹的查詢,即使有一千個資料,查詢次數最多為1+2+4+8+16+32+64+128+256+512,最多為10次,大大提高了執行的效率。

而且c++有許多stl都非常好用,以後要多多學習啊。

輸入n個整數,找出其中最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,牛客網題目鏈結 使用最大堆實現,1.構建大小為k的最大堆 2.如果新元素小於當前最大堆的堆頂元素,則替換堆頂,調整最大堆 3.題目要求按照從小到大順序輸出最小的k個數,所以最後需要...

輸入n個整數,找出其中最小的K個數。

題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路 可以使用排序 這裡我採用快排,獲取到乙個有順序的陣列,然後獲取它的前n個 先使用快排排序 public static void quicksort int arr,in...

輸入n個整數,輸出其中最小的k個

輸入n個整數,輸出其中最小的k個。詳細描述 介面說明 原型 bool getmink unsignedint uiinputnum,int pinputarray,unsignedint uik,int poutputarray 輸入引數 unsignedint uiinputnum 輸入整數個數 ...