次序選擇問題

2021-10-08 06:34:58 字數 1131 閱讀 4892

給定乙個陣列a,求出第k小的元素。

這是乙個次序選擇問題,求解方法多種,此處介紹在快排的思想上進行改造的分治演算法。

原陣列

原陣列通過一次分解,求出隨機選出的新主元的位置,該位置返回到主遞迴函式賦值給變數q

比較k和q的位置,若k在q的右邊,則只對右邊進行進一次拆分,若為左邊則相反。直到q的位置剛好對應的是k所表達的位置,則此時q位置的元素為第k小的元素,因為它左邊的都比它小,右邊的都比它大。比較這一步要注意。

#include

using

namespace std;

#include

// 隨機選取主元並且把陣列按照主元分解,並返回主元最後的位置(與快排完全一致)

intrandomized_partition

(int a,

int l,

int r)

}// 如果沒有,就直接把p2往下;

else

++p2;

}// 把主元放中間

p = a[r]

; a[r]

= a[p1]

; a[p1]

= p;

// 返回主元現在的位置

return p1;

}// 進行次序選擇

intrandomized_selection

(int a,

int k,

int l,

int r)

intmain()

; cout <<

"原陣列為:"

;for

(int i =

0; i <6;

++i)

cout << a[i]

<<

" ";

// 找第二小的元素

int ans=

randomized_selection

(a,2,0

,5);

cout <<

"第二小的元素為:"

<

return0;

}

時間複雜度:最快是n,最慢是n^2,期望是nlog

最優服務次序問題

time limit 1000ms memory limit 65536k 有疑問?點這裡 設有n 個顧客同時等待一項服務。顧客i需要的服務時間為t i,1 i n。應如何安排n個顧客的服務次序才能使平均等待時間達到最小?平均等待時間是n 個顧客等待服務時間的總和除以n。對於給定的n 個顧客需要的服...

最優服務次序問題

問題描述 設有n個顧客同時等待一項服務。顧客i需要的服務時間為tj,1 i n.應如何安排n個顧客的服務次序才能使平均等待時間達到最小?平均等待時間是n個顧客等待服務時間的總和除以n 輸入 第一行 輸出 計算出最小的平均等待時間 include using namespace std int mai...

最優服務次序問題

設有n個顧客同時等待一項服務。顧客 i需要的服務時間為 ti。應如何安排 n個顧客的服務次序才能使平均等待時間達到最小 平均等待時間是 n個顧客等待直到 完成服務的時間總和除以n。程式設計任務 對於給定的n 個顧客需要的服務時間,程式設計計算最優服務次序。輸入 測試資料第一行是正整數n n 1000...