查詢最小的k 個元素之C 演算法實現

2022-04-01 23:05:02 字數 950 閱讀 2177

看到題目的時候我第一反應,這題很簡單,使用任何方式的排序將數列按順序儲存,之後遍歷需要的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...