線性時間選擇問題(找第k大的數)

2021-10-10 13:26:20 字數 404 閱讀 1950

給定線性序集中n個元素和乙個整數k,n<=2000000,1<=k<=n,要求找出這n個元素中第k小的數。

第一行有兩個正整數n,k.

接下來是n個整數(0<=ai<=1e9)。

輸出第k小的數

6 31 3 5 2 4 6

定義陣列a存放資料,由於資料較多,用scanf進行輸入。陣列從0開始存入資料,所以第k大的數是排好序後的陣列中的第k-1個。

用函式qsort對陣列進行快排,函式partition查詢陣列的中位數,函式swap進行交換。

partition函式以a[l]為基準,從兩端分別進行檢查,如果a[i]a[l],什麼都不執行,如果a[i]>a[l],a[j]如果中位數q比k的值小,說明要找的數在中位數左邊,就從(l,q-1)重新找,如果q比k大,說明要找的數在中位數右邊,從&

nth element 找第k大的數

nth element用於排序乙個區間,它使得位置n上的元素正好誰全排序情況下的第n個元素,而且,當nth element返回的時候,所有按照全排序規則排在位置n之前的元素也都排在位置n之前,按照全排序規則排在n之後的元素全都排在位置n之後。所以,我們使用nth element既可以尋找最好的前k個...

線性時間選擇 第k個數

採用的演算法思想和快速排序十分相似,選取基準進行一次快排,得到乙個基準和左側小於基準右側大於基準的陣列。然後判斷基準的位置,如果第k個數在左邊便接著向左遞迴,如果在右側便接著向右側遞迴。include include include include include include includeus...

線性時間選擇(C ) 求第k小的數

思想 首先對整個陣列進行劃分,利用partition函式,以陣列中某個數為基準 這裡以首項為標準 將陣列劃分為兩部分 左邊部分的所有數都小於基準,右邊部分都大於基準,並返回基準數的下標值。然後,如果要找到第k小個數,就將k的大小與陣列左半邊元素的個數 若為 j,包括基準 進行比較,如果k小於j,則對...