三種方法實現選擇問題

2021-10-24 15:50:51 字數 2717 閱讀 2206

一、選擇問題

選擇問題(selection problem)是求一陣列(n個數)中第k(k <= n)個最小元素的問題。

二、三種方法實現

1.確定演算法

①lomuto劃分

②hoare劃分

2.非確定演算法(概率演算法)

③sherwood演算法

三、lomuto劃分1

**:

#include

#include

using

namespace std;

void

swap

(int

* a,

int* b)

intlomuto

(int _array,

int l,

int r)

swap

(&_array[i]

,&_array[l]);

return i;

}int

selection

(int _array,

int l,

int r,

int _k)

intmain()

, k =3;

int len =

sizeof

(array)

/sizeof

(array[0]

);//選出第k個最小元素

int ans =

selection

(array,

0, len -

1, k)

;//output

printf

("第%d個最小元素:%d"

, k, ans)

;return0;

}

結果:

四、hoare劃分2

**:

#include

#include

using

namespace std;

void

swap

(int

* a,

int* b)

inthoare

(int _array,

int l,

int r)

_array[l]

= temp;

return l;

}int

selection

(int _array,

int l,

int r,

int _k)

intmain()

, k =3;

int len =

sizeof

(array)

/sizeof

(array[0]

);//選出第k個最小元素

int ans =

selection

(array,

0, len -

1, k)

;//output

printf

("第%d個最小元素:%d"

, k, ans)

;return0;

}

和「三、lomuto劃分」的**相比,僅僅改變劃分的**即可

五、sherwood演算法

動機:以上兩種劃分方式,都是選擇第乙個數作為劃分元,但是如果初始陣列已經是遞增或遞減的順序,則時間複雜度就增大了。

為解決這一問題,在劃分之前打亂陣列的初始順序,即洗牌(shuffle)

#include

#include

#include

#include

using

namespace std;

void

print

(int _array,

int _len)

}void

swap

(int

* a,

int* b)

intuniform

(int n)

void

shuffle

(int _array,

int _len)

}int

main()

;int len =

sizeof

(array)

/sizeof

(array[0]

);printf

("陣列的初始序列:");

print

(array, len)

;//洗牌

srand((

unsigned

)time

(null))

;shuffle

(array, len)

;//output

printf

("陣列的洗牌後序列:");

print

(array, len)

;return0;

}

結果:

六、擴充套件閱讀

選擇問題(求第k個最小元素)↩︎

hoare劃分↩︎

最優佈線問題(三種方法)

學校有n臺計算機,為了方便資料傳輸,現要將它們用資料線連線起來。兩台計算機被連線是指它們之間有資料線連線。由於計算機所處的位置不同,因此不同的兩台計算機的連線費用往往是不同的。當然,如果將任意兩台計算機都用資料線連線,費用將是相當龐大的。為了節省費用,我們採用資料的間接傳輸手段,即一台計算機可以間接...

三種方法 2020 11 23

利用連線類,例項化得到連線物件 連線類 連線物件 new 連線類 cmd.executescalar cmd.excutereader 關注其中一條資料 物件名.read 獲取關注列所對應的值 console.writeline 物件名 name while 物件名.read 功能,聚焦下一行資料。...

三種方法實現CSS三欄布局

本文由雲 社群發表 本文會分別介紹三種css實現三欄布局的方法,可在瀏覽器中開啟檢視效果 實現方法 需要左欄向左浮動,右欄向右浮動,中間設左右margin來撐開距離 doctype html en utf 8 css實現三欄布局1 title text css body left middle ri...