尋找最小的 k 個數

2021-07-02 12:43:16 字數 1629 閱讀 7613

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

使用排序的方法來解決該問題。快速排序所費時間複雜度為o(n*logn).排序完成過後,只需要取前k個數值即是最小的k個數。

int array = ;

const int length = sizeof(array)/sizeof(array[0]);

void printarray(int a, int len)

return low;

}void quicksort(int (&s)[length], int low, int high)

}void minnumber(int a, int k);

const int length = sizeof(array)/sizeof(array[0]);

void printarray(int a, int len)

void selectkminnumber(int (&r)[length], int k, int len)

for(int i=0; i在思路2中最耗時的操作就是遍歷來獲取kmax和kmin,他們的複雜度分布為o(k)和o(length-k),由於其中的資料時無序的,我們只需要找到最大數或者最小數即可,那麼我們可以考慮使用堆,求kmax時,在前k個數中使用最大堆,可以很容易獲得kmax,並且複雜度也降為o(logk);後length-k中求kmin,可以使用最小堆,這樣就很容易求得kmin了,然後再重複上述的比較步驟,整體的複雜度會降低很多。

但是整體的**會比較複雜,尤其是在寫求最小堆進而求得kmin時,更容易出錯,所以此時一般都是建議只寫求最大堆的部分,而後面的比較部分則就是用kmax依次與後面的length-k個數進行比較即可

#includeusing namespace std;

int array = ;

const int length = sizeof(array)/sizeof(array[0]);

const int k = 4;

void printarray(int a, int len)else

r[pos] = temp;

}}/*這部分的**很容易出錯,因為這是將陣列中資料分為兩部分進行求最大堆和最小堆,第一部分

下標陣列很容易界定,只需要注意該部分的長度即可,而第二部分則不光需要注意長度,還要注意下

標,因為下標不對,那麼整個陣列到最後求出來的就是很混亂的,因此需要將傳輸進來的pos值對應陣列中的值時,都移動k*/

void smallheapadjust(int (&s)[length], int pos, int len) else

s[pos+k] = temp;

}}void buildingbigheap(int (&b)[length], int len)

cout << "buildingbigheap : ";

printarray(b, len);

}void buildingsmallheap(int (&d)[length], int len)

void selectkmin(int (&arr)[length], int k)

for(int i=0; icout << arr[i] << " ";

cout << endl;

}int main()

尋找最小的k個數

尋找最小的k個數 在乙個長度為n的陣列中,尋找最小的k個數。最大的k個數解法類似 想法比較簡單,先對n個數排序,再輸入前面k個數,即可。這種方法的時間複雜度比較大。假設我們使用快排,需要o nlogn 然後輸出k個數需要o k 一共要o nlogn 略。這種方法比較好,演算法簡單,易於實現。先把陣列...

尋找最小的k個數

輸入n個整數,輸出其中最小的k個。要求乙個序列中最小的k個數,按照慣有的思維方式,則是先對這個序列從小到大排序,然後輸出前面的最小的k個數。至於選取什麼的排序方法,我想你可能會第一時間想到快速排序 我們知道,快速排序平均所費時間為n logn 然後再遍歷序列中前k個元素輸出即可。因此,總的時間複雜度...

尋找最小的k個數

輸入n個整數,輸出其中最小的k個。要求乙個序列中最小的k個數,按照慣有的思維方式,則是先對這個序列從小到大排序,然後輸出前面的最小的k個數。至於選取什麼的排序方法,我想你可能會第一時間想到快速排序 我們知道,快速排序平均所費時間為n logn 然後再遍歷序列中前k個元素輸出即可。因此,總的時間複雜度...