原本想看看動態規劃的,瞄到了乙個線性時間選擇的問題,之前看懂了又忘了,於是加深加深印象。
給定線性序集中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...