在乙個n
nn個元素的集合中,至少需要做n−1
n-1n−
1次比較才能確定其最小元素或最大元素。下面的偽**給出了最樸素的一種方式:
minmum
(a) min = a[1]
for i =
2 to a.length
if min > a[i]
min = a[i]
return min
當需要同時確定最大最小值時,如果利用上述方法對每個元素進行兩次比較,則所需比較次數為2(n
−1
)2(n-1)
2(n−1)
。一種最多需要3⌊n
/2
⌋3\lfloor n/2\rfloor
3⌊n/2⌋
次比較就同時確定最大最小值的方法:首先將輸入中的一對元素進行比較,然後將較小值與當前的最小值進行比較,將最大值與當前的最大值進行比較。這樣,每兩個元素僅需要進行三次比較。(具體c++實現在文末的附錄中。)
上面看到,我們可以很容易在θ(n
)\theta(n)
θ(n)
時間確定序列中的最大元素或者最小元素;
當我們需要確定序列中的某個順序量,例如確定序列中第i
ii小的數時,看似比上面的問題複雜許多,但實際上兩者的漸近執行時間時相同的:θ(n
)\theta(n)
θ(n)
。下面給出基於分治策略的求解方法,該方法和快速排序的方法幾乎一致,但與快速排序不同的是該演算法只需要處理劃分之後的一邊,因此且遞迴樹比快速排序小許多,執行時間在期望情況下為θ(n
)\theta(n)
θ(n)
。
quick_select
(a, p, r, i)
if p == r
return a[p]
q =randomized_partition
(a, p, r)
k = q - p +
1if i == k
return a[q]
else
if i < k
quick_select
(a, p, q -
1, i)
else
quick_select
(a, q +
1, r, i - k)
注:k
kk為小於劃分點q
qq的元素個數。如果k=i
k=ik=
i,則a[q]就是要查詢的元素;如果k
>
ik>i
k>
i,則要查詢的元素在a[q
]a[q]
a[q]
的左側,否則在右側。如果要查詢的元素在a[q
]a[q]
a[q]
的右側,則遞迴呼叫quick_select
時,要查詢的元素應為第i−k
i-ki−
k個。
#include
#include
using
namespace std;
struct minmax
;minmax minmax
(vector<
int>
& data);if
(data.
size()
==0)return minmax;
else
if(data.
size()
==1)else
else
for(
; i < data.
size()
; i +=2
)else
if(mintemp < minmax.min) minmax.min = mintemp;
if(maxtemp > minmax.max) minmax.max = maxtemp;
}return minmax;}}
intmain
(int argc,
char
* ar**)
; minmax ret =
minmax
(data)
; cout << ret.min <<
" "<< ret.max << endl;
return1;
}
#include
#include
#include
using
namespace std;
class
quick_select
;void quick_select::
exchange
(vector<
int>
& data,
int a,
int b)
int quick_select::
randomized_partition
(vector<
int>
&data,
int p,
int r)
}exchange
(data, i +
1, r)
;return i +1;
}int quick_select::
select
(vector<
int>
& data,
int p,
int r,
int i)
else
select
(data, q +
1, r, i - k);}
intmain
(int argc,
char
* ar**)
; quick_select a;
int ret = a.
select
(data,0,
9,5)
; cout << ret << endl;
return1;
}
演算法導論 中位數和順序統計量
在乙個由n個元素組成的集合中,第i個順序統計量是該集合中第i小的元素。乙個中位數是它所屬集合的 中點元素 當n為奇數時,中位數是唯一的,位於i n 1 2處 當n為偶數時,存在兩個中位數,分別位於i n 2和i n 2 1處。如果不考慮n的奇偶性,中位數總是出現在i n 1 2 處 下中位數 和i ...
演算法導論筆記 09中位數和順序統計量
1 n個元素組成的集合,第 i個順序統計量,就是該集合中第 i小的元素。所以,集合中的最小值就是第1個順序統計量,最大值就是第n個順序統計量。中位數是所屬集合的 中點元素 當n是奇數的時候,中位數唯一,位於 n 1 2處。如果n是偶數,中位數有兩個,分別位於n 2和 n 2 1。2 選擇問題,就是選...
演算法導論 9 中位數和順序統計量
乙個中位數是它所屬集合的中點元素 9.1.1 在乙個有n個元素的集合中,需要做多少次比較才能確定其最小元素呢 9.1.2 同時找到最小值和最大值 實現 同時求解最大值和最小值 123 4567 891011 1213 1415 1617 1819 2021 2223 2425 26 def mini...