用分治法實現元素選擇

2021-04-06 22:37:53 字數 1310 閱讀 7465

實驗內容:

1、給定線形序列集中n個元素和乙個整數k,1≤k≤n,輸出這n個元素中第k小元素的值及其位置;

2、簡述該演算法的原理、步驟。對該演算法與直接排序查詢進行比較;

3、編寫並除錯程式。

測試要求:元素個數不少於100

// selectk.cpp : 分治法選擇第k 小的元素。

// vc++6.0 下測試通過

#include

#include

#include

// 交換兩個變數的值

void swap(int& a, int& b)

// 在a [ l : r ]中選擇第k小的元素

int select(int a, int l, int r, int k)

while (a[i] < pivot);

do while (a[j] > pivot);

if (i >= j) break; // 未發現交換物件

swap(a[i], a[j]);

}if (j - l + 1 == k) return pivot;

// 設定pivot

a[l] = a[j];

a[j] = pivot;

// 對乙個段進行遞迴呼叫

if (j - l + 1 < k)

return select(a, j+1, r, k-j+l-1);

else

return select(a, l, j-1, k);

}// 列印陣列時,每行的數字個數。

const int numbersperline = 15;

// 列印陣列資料到螢幕

void print(int a, int n)

// 主函式,程式入口點

void main()

inputk:

cout<<"請輸入k,範圍為1~"<

goto inputk;

}// 隨機生成n個元素

int * a = new int [n];

srand( (unsigned)time( null ) );

int bound = n * 10; // 最大值為n的10倍。

for(int i = 0; i < n; ++ i)

// 顯示生成的資料

cout<

cout<<"隨機生成的"<

print(a,n);

// 計算結果

cout<

cout<<"第"<

cout<

// 釋放資料記憶體

delete a;

}

選擇問題(第k小元素)(分治法)

selection algorithm 選擇問題即第k小元素問題。解決該問題的基本思想與快速排序演算法相同,通過選擇基元進行劃分,從而知道第k小元素在 原始資料使用隨機函式生成。採用結構化程式設計,可以很容易改為從標準輸入或檔案讀入資料,只需要修改函式getdata即可。資料個數由巨集定義給出,也可...

分治法 169多數元素

今天是第一次做演算法題,希望這門課能學好吧。給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。示例 1 輸入 3,2,3 輸出 3 雖然這道題有很多解法,但這次我只用分治策略來解決。首先,需要理解題...

分治法 用C 實現合併排序

合併排序的思想 當只有乙個元素時終止排序,超過乙個元素的話,將所有元素分成大致相同的兩個集合,分別對兩個集合進行排序,最後將排好序的子集合合併為所要求的排好序的集合。在最壞情況下,時間複雜度為o nlogn 它是乙個漸進的最優演算法。include include 這個函式將b 0 至b right...