例題二本部落格其他文章推薦
對於給定的n個元素的陣列a[0:n—1],要求從中找出第k小的元素
輸入:輸入有多組測試例。
對每乙個測試例有2行
第一行是整數n和k(1≤k<n≤1000)
第二行是n個整數
輸出:第k小的元素
我們知道,快速排序演算法的一次排序的思想是:
找到乙個數字作為標準,把比該數小的放左邊,比該數大的放右邊
#include
#include
#define n 100
using
namespace std;
//一維陣列容器
int a[n]
;//線性選擇演算法尋找第k小的元素
intlineartimeselection
(int
,int
,int);
intmain()
cout<<
"輸入陣列元素:"
;for
(int i=
0;i) cin>>a[i]
; cout<<
"查詢第幾小的元素:"
; cin>>k;
if(k > n || k <1)
cout<<
lineartimeselection(0
,n-1
,k);
return0;
}/*left 進行線性選擇的首位下標
right 進行線性選擇的末尾下標
k 尋找第k位小的元素
*/int
lineartimeselection
(int left,
int right,
int k)
while
(a[i]
< point);do
while
(a[j]
> point);if
(i>=j)
break
;swap
(a[i]
,a[j]);
}if(j-left+
1== k)
return point;
a[left]
= a[j]
; a[j]
= point;
if(j-left+
1< k)
return
lineartimeselection
(j+1
,right,k-
(j+1
-left));
//向右找
return
lineartimeselection
(left,j-
1,k)
;//向左找
}
某石油公司計畫建造一條由東向西的主輸油管道。該管道要穿過乙個有n口油井的油田。從每口油井都要有一條輸油管道沿最短路經(或南或北)與主管道相連。
如果給定n口油井的位置,即它們的x座標(東西向)和y座標(南北向),程式設計計算各油井到主管道之間的輸油管道最小長度總和。
輸入第1行是乙個整數n,表示油井的數量(1≤n≤10 000)
接下來n行是油井的位置,每行兩個整數x和y(-10 000≤x,y≤10 000)
輸出各油井到主管道之間的輸油管道最小長度總和
輸入樣例
51 2
2 21 3
3 -2
3 3輸出樣例
6樣例圖
//儲存油井的y值
int a[n]
;//線性時間選擇演算法
intlineartimeselection
(int
,int
,int);
intmain()
cout<
return0;
}int
lineartimeselection
(int left,
int right,
int k)
while
(a[i]
while
(a[j]
>point);if
(i>=j)
break
;swap
(a[i]
,a[j]);
}if(j-left+
1== k)
return point;
a[left]
= a[j]
; a[j]
= point;
if(j-left+
1< k)
return
lineartimeselection
(j+1
,right,k-
(j-left+1)
);return
lineartimeselection
(left,j-
1,k)
;}演算法設計與分析之分治策略練習(下)
演算法設計與分析之分治策略練習(上)
演算法設計與分析之分治策略
演算法設計與分析之遞迴演算法練習(下)
演算法設計與分析之遞迴演算法練習(上)
演算法設計與分析 遞迴與分治策略 線性時間選擇
問題描述 給定線性序集中n個元素和乙個整數k,1 k n.要求找出這n個元素中第k小的元素,即如果將這個n個元素依其線性序排列時,排在第k個位置的元素就是要找的元素,當k 1時,要找的就是最小的元素 當k n,就是最大的元素 當k n 1 2,稱為中位數。問題分析 在某些特殊的情況下,我們可以實現線...
經典演算法之線性時間選擇的C實現方法
線性時間選擇問題,實際上是隨機快速排序演算法的乙個引申,ie,通過對隨機快速排序演算法的小小改動就可以實現。源 如下 隨機選擇 author zhyh2010 date 20150606 version 1.0 description 隨機選擇 include include define num ...
期望為線性時間選擇演算法
一般選擇問題看起來要比我麼找最小值這樣的簡單問題更難。但這兩個問題的漸進執行時間卻是相同的 n randomized select演算法,以快速排序演算法為模型。與快速排序不同的是,快速排序會遞迴處理劃分的兩邊,而randomized select只處理劃分的一邊。快速排序執行的時間是 n n 而r...