選擇問題演算法

2021-06-29 12:12:09 字數 2026 閱讀 3531

對於給定的

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來解的話,就需要找到最優解的...