線性時間元素選擇 舍伍德演算法

2021-10-07 01:49:49 字數 2033 閱讀 1737

**如下

randomnumber.h

#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)

}

線性時間元素選擇.cpp

#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 數值概率演算法 正文 這一章怎麼說呢,我個人感覺不好理解,在網上查了一些資料,沒發現有具體對舍伍德演算法的介紹。有時間我把那本書上講舍伍德的一段給拍下來放到文章裡 書上對舍伍德講的比較詳細,但是不太好理解,一定要多看幾遍。我這裡只說下他的基本...