線性時間選擇

2021-10-01 04:26:47 字數 1681 閱讀 6945

原本想看看動態規劃的,瞄到了乙個線性時間選擇的問題,之前看懂了又忘了,於是加深加深印象。

給定線性序集中n個元素和乙個整數k,1<=k<=n,要求找出這n個元素中第k小的元素。

將元素每五個分為一組,分別找出中位數,再找到中位數的中位數。基於這個數進行快排。如此一來,每次都至少能分出1/4左右的元素,避免直接快排產生的最壞情況。讓人不禁感嘆這就是大師的智慧型。?

**:

#include

#include

using namespace std;

void

swap

(int

&a,int

&b)void

quicksort

(int nums,

int left,

int right)

//快排

nums[low]

= key;

quicksort

(nums,left,low -1)

;quicksort

(nums,low +

1,right);}

intpartition

(int nums,

int p,

int r,

int x)

//陣列從p到r,基於x快排 !一次 !

swap

(nums[i]

,nums[p]);

int low = p;

int high = r;

int key = nums[low]

;while

(low < high)

nums[low]

= key;

return low;

}int

select

(int nums,

int p,

int r,

int k)

//陣列從p到r,找到第k個

for(

int i =

0;i <

(r-p-4)

/5; i++

)//分成5組

quicksort

(nums,p,p -1+

(r-p-4)

/5);

int x = nums[p +

(r-p-4)

/10];

int i =

partition

(nums,p,r,x)

;//i是x的位置 ,x已被快排1次

int j = i - p +1;

//j是x的排名

//如果k在x的右邊 ,x前去掉

if(k <= j)

select

(nums,p,i,k)

;else

select

(nums,i+

1,r,k-j);}

intmain()

; cin>>x;

printf

("第%d小的數是%d\n"

,x,select

(a,0,79

,x))

;return0;

}

看這倆哥的:

線性時間選擇

今天學習了線性時間選擇,主要是通過快排的方法,在乙個平均時間線性的情況下進行第k小元素的選擇,結合一道題目進行描述 題目來自演算法設計與分析就是王曉東的那本 output.txt 這題目分析一下可以得出就是尋找中位數 為什麼呢?將這些數字排列在數軸上尋找乙個到各個點距離最小的那個點,可以得知最中間的...

線性時間選擇

出自 http algorithm.chaoskey.com 02 07 題目 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k小的元素,這裡給定的線性集是無序的 具體解題 這裡我們將所有的數 n個 以每5個劃分為一組,共 n 5 組 將不足五個的那組忽略 然後用任意一種排序...

線性時間選擇

這相當於是對於快速排序的基準選擇的乙個優化,使得選擇演算法達到線性時間。include include include includevoid swap int a,int b int compare const void a,const void b int partition int a,int...