給定乙個陣列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...