在數列a[1...n] 中查詢第f小的數
演算法如下:
1任意選定乙個數r(比如說a[f]),然後將a[m...n]分成兩部分:
a[m],...a[k],a[k+1],...a[n]
並滿足 a[m],...,a[k]<=r a[k+1],a[n]>=r
2如果 f屬於[m,k],另n=k
3如果f屬於[k+1,n],另m=k+1
4如果 m=n=k,終止
次演算法將a[1,n]分成三部分
a[1,m-1]<=a[m,n]<=a[n+1,n]
步驟一:問題定義
*前條件:給定數列a[1...n],和1<=f<=n
*後條件:移動a使得a滿足
對於任意p,q(1<=p<=f<=q<=n 可推出a[p]<=a[f]<=a[q]) (found)
步驟二:尋找中間變數(不變數)
*定義中間變數m和n,滿足a[m]是中間部分第乙個元素,a[n]是中間部分最後乙個元素
*不變數的目的:
m<=f且對於任意p,q(1<=pf<=n 且對於任意p,q(1<=p<=n*決定m和n的初始值:
m=1,n=n
*檢查初始值是否滿足不變數
*定義遞增情況:
while m*該迴圈能否完成目標任務:迴圈終止時:
m-inv且n-inv且(m可推出 m==n==且對於任意p,q(1<=p<=f<=q<=n 可推出 a[p]<=a[f]<=a[q]) 結論成立
*得到程式結構:
牛客 第k小數 線性尋找第 k 小數
題目大意 給出長度為 n 的數列 a 要求找到第 k 小的數 題目分析 因為資料給的足夠大,所以約束就是必須線性完成操作,stl 中的 nth element 函式可以完美實現操作,算是學到了一波,格式 nth element a.begin a.begin k a.end 那麼 a k 就是第 k...
陣列中的第k小數
描述 以盡量高效率求出亂序中的k小數 輸入 第一行 陣列長度 第二行 陣列元素 空格隔開 第三性 第幾小的數 輸出 第k小的數 樣例輸入 5 6 1 2 9 3 8 2樣例輸出 解題思路利用快速排序找到主元的位置,判斷主元是第幾小的 主元位置大了剪掉右邊的 主元位置小了剪掉左邊的 假設要找第三小的數...
尋找第K小的數
尋找第k小的數屬於順序統計學範疇,通常我們可以直接在o nlgn 的時間內找到第k小的數,使用歸併排序或者堆排序對輸入資料按從小到大進行排序,然後選擇第k個即可。然而,我們還有更好的演算法。首先來看乙個簡單的問題,在乙個有n個元素的集合中,需要多少次比較才能確定其最小值呢?這可以很容易退出需要n 1...