這相當於是對於快速排序的基準選擇的乙個優化,使得選擇演算法達到線性時間。
#include#include#include #includevoid swap(int &a, int &b)
int compare(const void *a, const void *b)
// int partition(int a, int p, int r, int x)//以第乙個位置作為分割起點
// // a[i] = a[0];
// return i;//返回結束後分割點所在的位置
// }
int partition(int a, int p, int r,int x)//以第乙個位置作為分割起點
a[p] = a[j];
a[j] = t;
return j;//返回結束後分割點所在的位置
}int select(int a, int p, int r, int k)//線性時間選擇 在a[p:r]中選擇第k小元素 的位置
int n;
for (int i = 0;i <= (r - p - 4) / 5;i++)
int flag = 0;
if ((r-p-5*n+1)!=0)
//找中位數的中位數
int x = select(a, p, p + (r - p - 4) / 5 + flag - 1, ((r - p - 4) / 5 + flag - 1)/2);//t(n/5)
//int x = select(a, p, p + (r - p - 4) / 5, p + (r - p - 4) / 10);
//以x作為分割點進行分割
int i = partition(a, p, r, x), j = i - p + 1;
flag = 0;
if (k <= j) return select(a, p, i, k);
else return select(a, i + 1, r, k - j);
}int a[2000100];
int main()
int t = select(a, 1, i - 1, i / 2);
printf("%d\n",a[t]) ;
}
線性時間選擇
今天學習了線性時間選擇,主要是通過快排的方法,在乙個平均時間線性的情況下進行第k小元素的選擇,結合一道題目進行描述 題目來自演算法設計與分析就是王曉東的那本 output.txt 這題目分析一下可以得出就是尋找中位數 為什麼呢?將這些數字排列在數軸上尋找乙個到各個點距離最小的那個點,可以得知最中間的...
線性時間選擇
出自 http algorithm.chaoskey.com 02 07 題目 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k小的元素,這裡給定的線性集是無序的 具體解題 這裡我們將所有的數 n個 以每5個劃分為一組,共 n 5 組 將不足五個的那組忽略 然後用任意一種排序...
線性時間選擇
參考演算法設計與分析。include using namespace std inline int random int x,int y int partition int a,int p,int r,int k return j 返回i跟返回j是一樣的。int select int a,int p...