**如下
randomnumber.h
線性時間元素選擇.cpp#pragma once
#include
#include
using
namespace std;
const
unsigned
long maxshort =
65536l
;const
unsigned
long multiplier =
1194211693l
;const
unsigned
long adder =
12345l
;class
randomnumber
;randomnumber::
randomnumber
(unsigned
long s)
else
}unsigned
short randomnumber::
random
(unsigned
long n)
double randomnumber::
frandom
(void
)int
tosscoins
(int numbercoins)
return tosses;
}void
createdatafun
(int n)
}
#include
//#include
#include
#include
"randomnumber.h"
#define maxvalue 32767
using
namespace std;
template
<
class
type
>
inline
void
swap
(type& a, type& b)
template
<
class
type
>
type select
(type a,
int l,
int r,
int k)
int i = l,
j = l + rnd.
random
(r - l +1)
;//隨機選擇劃分基準
swap
(a[i]
, a[j]);
j = r +1;
type pivot = a[l]
;//以劃分基準為軸做元素交換
while
(true
)swap
(a[i]
, a[j]);
}if(j - l +
1== k)
//第k小
//a[j]必然小於pivot,做最後一次交換,滿足左側比pivot小,右側比pivot大
a[l]
= a[j]
; a[j]
= pivot;
//對子陣列重複劃分過程
if(j - l +
1< k)
else}}
template
<
class
type
>
type select
(type a,
int n,
int k)
return
select
(a,0
, n -
1, k);}
intmain()
out <<
"所給陣列第"
<"小元素為:"
<<
select
(a, n, k)
<< endl;
#endif
return0;
}
舍伍德演算法解決線性時間選擇
一 需求分析 0.問題描述 元素選擇問題的一般提法是 給定線性序集中n個元素和乙個整數k 1 k n 要求找出這n個元素中第k小的元素,即如果將這n個元素依其線性序排列時,排在第k個位置的元素即為要找的元素。當k 1時,就是要找的最小元素 當k n時,就是要找最大元素 當k n 1 2 時,稱為找中...
舍伍德型別概率演算法
舍伍德型別概率演算法的特點 總能求得問題的乙個解,且所求得的解總是正確的。問題描述 設計乙個快速排序的舍伍德型別概率演算法。問題解答 快速排序演算法的關鍵在於一次劃分中選擇合適的劃分基準元素,如果基準是序列中最小的 或最大的 元素,則一次劃分後得到的兩個子串行不均衡,使得快速排序的時間效能降低。舍伍...
舍伍德演算法(轉 用來說明演算法導論題目!!!)
已出 1.隨機化演算法 1 隨機數 2.隨機化演算法 2 數值概率演算法 正文 這一章怎麼說呢,我個人感覺不好理解,在網上查了一些資料,沒發現有具體對舍伍德演算法的介紹。有時間我把那本書上講舍伍德的一段給拍下來放到文章裡 書上對舍伍德講的比較詳細,但是不太好理解,一定要多看幾遍。我這裡只說下他的基本...