一、需求分析
0.問題描述
元素選擇問題的一般提法是:給定線性序集中n個元素和乙個整數k (1≤k≤n), 要求找出這n個元素中第k小的元素,即如果將這n個元素依其線性序排列時,排在第k個位置的元素即為要找的元素。當k=1時,就是要找的最小元素:當k=n時, 就是要找最大元素;當k=(n+1)/2 時,稱為找中位數。1.問題分析3.輸出資料分析並闡述要輸出的資訊和資料(結果)
4.測試樣例設計
針對問題的功能,設計5組有代表性的測試樣例,說明每組測試樣例的測試目的
二、演算法設計與分析
1.演算法的基本思想
類似於快排的一種思想。
2.輸入和輸出的格式
3.演算法的具體步驟
4.演算法的時空分析
①時間複雜度:
②空間複雜度:
儲存元素的值,o(n)
三、測試結果
全部**:
#include #include #include #include using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");
//內聯交換函式
template inline void swap(type& a, type& b)
templatetype select(type a, int l, int r, int k)
//隨機選擇劃分基準
int i = l, j = l + rand() % (r - l + 1);
swap(a[i], a[j]);
j = r + 1;
type pivot = a[l];
//以劃分基準為軸做元素交換
while (true)
swap(a[i], a[j]);
} //如果最後基準元素在第k個元素的位置,則找到了第k小的元素
if (j - l + 1 == k)
//a[j]必然小於pivot,做最後一次交換,滿足左側比pivot小,右側比pivot大
a[l] = a[j];
a[j] = pivot;
//對子陣列重複劃分過程
if (j - l + 1 < k)else }}
template type select(type a,int n,int k)
return select(a,0,n-1,k);
}int main()
in.close();
out.close();
return 0;
}
線性時間元素選擇 舍伍德演算法
如下 randomnumber.h pragma once include include using namespace std const unsigned long maxshort 65536l const unsigned long multiplier 1194211693l const...
舍伍德型別概率演算法
舍伍德型別概率演算法的特點 總能求得問題的乙個解,且所求得的解總是正確的。問題描述 設計乙個快速排序的舍伍德型別概率演算法。問題解答 快速排序演算法的關鍵在於一次劃分中選擇合適的劃分基準元素,如果基準是序列中最小的 或最大的 元素,則一次劃分後得到的兩個子串行不均衡,使得快速排序的時間效能降低。舍伍...
舍伍德演算法(轉 用來說明演算法導論題目!!!)
已出 1.隨機化演算法 1 隨機數 2.隨機化演算法 2 數值概率演算法 正文 這一章怎麼說呢,我個人感覺不好理解,在網上查了一些資料,沒發現有具體對舍伍德演算法的介紹。有時間我把那本書上講舍伍德的一段給拍下來放到文章裡 書上對舍伍德講的比較詳細,但是不太好理解,一定要多看幾遍。我這裡只說下他的基本...