一、選擇問題
選擇問題(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...