題目:
輸入n個整數,輸出其中的k個最小數。
例如:例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。
解題思路:
當然,方法最簡單的就是對這n個整數都進行排序操作,但這種方法的時間複雜度尤其的高。
因此,我採用了,用另外k個空間,以換取時間的方法 。每次從輸入的n個整數中讀入乙個數。如果陣列中已經插入的元素少於k個,則將讀入的整數直接放到陣列中。否則就是長度為k的陣列已經滿了,不能再往陣列裡插入元素,只能進行替換了。
如果讀入的這個整數比陣列中已有k個整數的最大值要小,則用讀入的這個整數替換這個最大值;如果讀入的整數比陣列中已有k個整數的最大值還要大,則讀入的這個整數不可能是最小的k個整數之一,拋棄這個整數。這種思路相當於只要排序k個整數,因此時間複雜可以降到o(n+nlogk)。通常情況下k要遠小於n,所以這種辦法要優於前面的思路。
vs2010中執行程式如下:例子程式是正確的,,如果有什麼錯誤,希望各位高手指定,,呵呵。。
#include#includeusing namespace std;
#define n 100
#define k 5
void bubble_sort_k(int array,int num)
} //if(flag == 1)
// break;
} return;
}int main()
; //int array_n[n] = ;
int array_k[k] = ;
int i = 0;
int j = 0;
int m = 0;
int number = 0;
while(cin>>i)
//number = 9;
for(j=0;jj;n--)//找到該數比哪個元素小之後,將其後的部分後移,即將最大元素移出陣列。
array_k[j] = array_n[i];
break;
}} }
for(m=0;m
每天一道演算法題4 查詢最小的k個元素
題目 輸入 n個整數,輸出其中最小的 k個。例如輸入 1,2,3,4,5,6,7和 8這 8個數字,則最小的 4個數字為 1,2,3和 4。分析 這道題最簡單的思路莫過於把輸入的 n個整數排序,這樣排在最前面的 k個數就是最小的 k個數。只是這種思路的時間複雜度為 o nlog n 我們試著尋找更快...
一天一演算法(43) 最小k個數
輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,超級簡單的題目,就是考察排序演算法而已 為了熟悉堆排序,使用了堆排 using system.collections.generic class solution heapsort...
查詢最小的k個元素
題目 輸入n個整數,輸出其中最小的k個。演算法思想,要是將n個數排序然後輸出前k個,方法很簡單,但計算量比較大,為o nlogn 要是新建乙個有k個元素陣列,在陣列不滿時,將每乙個輸入的資料存入陣列。若陣列滿了,則比較輸入的資料與陣列中最大元素的大小,來決定接下來幹什麼,接下來幹什麼,我語言表達能力...