線性時間選擇

2021-08-20 10:00:35 字數 1945 閱讀 6275

線性時間選擇問題:與排序問題類似的元素選擇問題。元素選擇問題的一般提法是:給定線性序集(無序的)中n個元素和乙個整數k,1≤k≤n,要求找出這n個元素中第k小(或大)的元素,即如果將這n個元素依其線性排序時,排在第k個位置的元素即為要找的元素。

**一:

不同於快排,線性時間選擇只對劃分出的子陣列之一進行遞迴處理。

基本思想:即對輸入的陣列進行遞迴劃分。

主要**之一:

int select(int a,int n,int x)

else

}}

1,呼叫select()函式,以陣列長度n和第x小元素作為函式形參。

2,與快排類似:通過呼叫fun()函式對陣列進行分割,並返回基準的在結束while迴圈後的下標m。運用if語句將m+1與第k小元素的比較,判斷是否再一次進行遞迴呼叫。運用while()語句無限迴圈,直至滿足if語句的條件,跳出迴圈。

主要**之二:

int fun(int a,int l,int r)

swap(a,j,l);//while()迴圈之後將j記錄的最後乙個大於基準值的元素與基準進行值交換

return j;//返回最後乙個大於基準的元素的下標

}

與快速排序演算法相類似,對陣列進行一次分割:以陣列在左端元素作為基準,實現基準以左的各個元素值均大於基準值,基準以右的元素的值均小於基準值。返回基準值在值交換後的下標。

補充:

//有關於swap()

void swap(int a,int x,int y)

完整**:

#include#define n 20

void swap(int a,int x,int y)

int fun(int a,int l,int r)

swap(a,j,l);

return j;

}int select(int a,int n,int x)

else }}

int main();

int b[n]=;

int i,x;

int m;

int n=12;

printf("排序前:\n");

for(i=0;i

**二:呼叫rand()函式隨機生成x;

#include#include#include#define n 20

void swap(int a,int x,int y)

int fun(int a,int l,int r)

swap(a,j,l);

return j;

}int select(int a,int n,int x)

else }}

int main();

int b[n]=;

int i,x;

int m;

int n=12;

printf("排序前:\n");

for(i=0;i

總結:

1,類似於快速排序演算法的思想,對陣列進行一次分割,分為兩個子陣列。

2,對其中之一進行遞迴處理。

3,1,2語句反覆迴圈,直至滿足select()函式中while迴圈的終止條件,返回a[m]。

上圖:以下兩張圖來自於

**二

來自於 **一

線性時間選擇

今天學習了線性時間選擇,主要是通過快排的方法,在乙個平均時間線性的情況下進行第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...