看到題目的時候我第一反應,這題很簡單,使用任何方式的排序將數列按順序儲存,之後遍歷需要的k個元素即可,於是自己動手很容易就完成了,但是後來在網路上發現很多人對這題的解決方式是用小根堆(minheap)或者大根堆(maxheap),這才意識到,其實出題人是醉翁之意不在酒,在乎複雜度的考慮也。
先寫用排序的方式完成題目的方式吧,不僅簡單,不需要費太多腦子,重要的是,正好趁這時候複習下排序,這裡用快速排序完成:
public static void quick_sort(int sort, int left, int right)} while (i <= j);
if (j > left) quick_sort(sort, left, j);
if (i < right) quick_sort(sort, i, right);
}
然後定義乙個minkmethod的方法來獲取所需元素:
public static void minkmethod(int sort, int k)console.writeline();
}if (k <= 0)
if (k > 0 && k < sort.length)
}}
這麼做的話,最快需要o(nlogn)的時間進行排序,然後在o(1)的時間內將k個數取出。
接下來看看如何用堆完成這個題:
public static void findkmin(int sort, int k)for (int i = k, len=heap.length; i < len; i++)
}if (orphan < heap[largerindex])
else
}heap[rootindex] = orphan;
}
用堆解決這個問題其實思路並不難,前提是,需要對堆有一定的理解。
查詢最小的k個元素
題目 輸入n個整數,輸出其中最小的k個。演算法思想,要是將n個數排序然後輸出前k個,方法很簡單,但計算量比較大,為o nlogn 要是新建乙個有k個元素陣列,在陣列不滿時,將每乙個輸入的資料存入陣列。若陣列滿了,則比較輸入的資料與陣列中最大元素的大小,來決定接下來幹什麼,接下來幹什麼,我語言表達能力...
查詢最小的k個元素
查詢最小的k個元素 題目 輸入n個整數,輸出其中最小的k個。例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。1 輸入元素,並排序 2 輸出前k個元素 排序 採用高效的排序方法,如 快速排序,歸併排序等 方法一 採用最簡單的方法 include include in...
查詢最小的k個元素
題目 輸入n個整數,輸出其中最小的k個數 例如 1 2 3 4 5 6 7 8 這8個數字,則最小的4個數字為1,2,3,4,第一種 直接對其先排序,再取頭幾個數 這樣最快是nlogn 快排或者堆排 include using namespace std void partsort int a,in...