線性時間選擇

2021-07-13 05:09:49 字數 1144 閱讀 9379

這相當於是對於快速排序的基準選擇的乙個優化,使得選擇演算法達到線性時間。

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