實驗內容:
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...