對於給定的
n 個元素的陣列a (
1 : n
),要求從中找出第
k小的元素。如果劃分元素
v測定在a(
j)的位置上,則有
j-1個元素小於或等於a(
j),且有
n-j個元素大於或等於a(
j)。因此,若
k,則第
k小元素在a(
1:j-1)中;若
k=j,則a
(j)就是第
k小元素;若
k>j
,則第k
小元素是a(
j+1:
n)中第(
k-j)小元素。所匯出的演算法如果成
select
。此過程把第
k小元素放在a(
k),並劃分剩餘的元素,使得a(
i)≤a(
k),1≤
i且a(i
)≥a(k
),k≤n。
演算法1.
3 找第k
小元素
procedure select(a,n,k) //
在陣列a(1
),…,a(n)中找第k小元素s並把它放在位置k,假設1≤k≤n。將剩下的元素按如下方式重新排列,使a(k)=t,對於1≤m//
integer n,k,m,r,j;
m<—1 ; r<— n+1; a(n+1) <—+無窮 ;
loop //
每當進入這一迴圈時,1≤
m≤k≤
n+1//
j r //
將剩餘元素的最大下標加
1後置給
j//
call partition(m,j) //返回j
,它使得a(
j)是第
j小的值//
case :
k=j:
return :
k:r j //j
是新的上界//
:else
:m j+1 //j+1
是新的下界//
endcase
repeat
end select
c語言**:
/*選擇問題:找第
k小的元素*/
#include /*
快速排序中的劃分函式
,其中陣列
array
的最後乙個數要為無窮大,
last
為這個數的下標加一
,也就是最後乙個元素的下標加一;
first
為陣列的第乙個元素的下標*/
intpartition (
intarray,
intfirst,
intlast)
n = n - 1;
while
(v < array[n]) if
(m < n)
else }
array[first] = array[n];
array[n] = v;
returnn;
} /*選擇函式,其中
n為陣列元素個數*/
intselect1(
intarray,
intn,
intk)
else
if((k-
1) < j)
else }
return
array[j]; }
intmain(
intargc,
char
** argv);
printf
("%d\n"
,partition
(arr, 0,
7));
for(int
i =
0; i <
7; i++)
printf
("\n%d"
, select1
(arr, 7,
1));
return0;
}
選擇問題的演算法
1 什麼叫選擇問題 設有一組 n個數,而要確定其中第 k個最大者。2 問題的解法 解法1 最容易想到的一種解法就是將這個 n個數讀入乙個陣列,然後通過某個比較簡單的排序演算法,如冒泡法,以遞減順序將陣列排序,然後位置 k上的數就是想要的第 k個最大數。總的時間複雜度為o n logn k 解法2 可...
演算法 活動選擇問題
encoding utf 8 import sys def greedy activity activity,begin,end activity list temp end time activity begin 1 獲取最小的結束時間 if begin end return activity l...
貪心演算法 活動選擇問題
活動選擇問題 就是給定一組活動的開始時間和結束時間,然後他們都需要使用到乙個資源,這個資源每次只有乙個活動可以用,要求求出乙個最大的相互相容的活動子集。首先定義了乙個集合sij 其中s就是所有活動的集合,fi是活動ai的完成時間si是活動ai的開始時間。這道題如果是用dp來解的話,就需要找到最優解的...