總結:這一章講了找最大值、最小值的方法,介紹了以期望線性時間找第
i小的數的方法,以及以最壞情況線性時間找第
i小的數的方法。
1.
最大值和最小值
找最小值,遍歷一遍即可
偽**minimum(a)
min <- a[1]
for i <- 2 to length[a]
do if min > a[i]
then min <- a[i]
return min
若要同時比較最大值和最小值,可以設兩個變數
max, min
,再將a
兩兩一對,先兩個比對一下,將小的與
min比較,大的與
max比較,這樣比較次數最多是
3[n/2]
2.
以期望線性時間做選擇
利用快排中的
randomized-partition,
它返回a
中的第i
小的元素
演算法分析:平均情況下
o(n)
,最壞情況
o(n^2)
偽**randomized-select(a, p, r, i)
if p=r
then return a[p]
q <- randomized-partition(a, p, r)
k <- q-p+1
if i=k
then return a[q]
elseif i
then return randomized-select(a, p, q-1, i)
else
return randomized-select(a, q+1, r, i-k)
3.
以最壞情況線性時間做選擇
演算法select
,最壞情況執行時間
o(n)
執行步驟:
1)將輸入陣列的
n個元素劃分為
[n/5]
組,每組
5個元素,且至多只有乙個組由剩下的
n mod5
個元素組成。
2)尋找
[n/5]
個組中每一組的中位數。首先對每組中的元素進行插入排序,然後從排序過的序列中選出中位數。
3)對第
2步中找出的
[n/5]
個中位數,遞迴呼叫
select
以找出其中位數x
4)利用修改過的
partition
過程,按中位數的中位數
x對輸入陣列進行劃分。設x是第
k小的元素。
5)如果
i=k,則返回
x。否則,如果
i,則在低區遞迴呼叫
select
以找出第
i小的元素,如果
i>k
,則在高區遞迴呼叫
select
以找出第
i-k個最小元素。
演算法導論 第九章
這章介紹了中位數和順序統計學 中位數即乙個序列中最中間的數字,在快速排序中非常有意義,在其它的一些應用中也很有效,因為可以2分序列,這樣會有更好的效率。這章主要介紹如何不排序來找到序列的順序,由於不需要排序,可以減少很多比較的操作,最終可以獲得一些線性的演算法,得到排名第i的數字。演算法的基礎是首先...
演算法導論第九章 中位數和順序統計量
9.1 最小值和最大值 遍歷陣列,線性時間求最小值 int minimun int a 兩兩相比,3n 2次比較即可求最小值和最大值 void minandmax int a,int min,int max 如果n是偶數 else 成對地處理餘下的元素 for i length a i i 2 9....
演算法導論 第九章 中位數和順序統計量
def 第i個順序統計量,是該集合中第i小的元素。def 選擇問題 輸入,乙個包含n個數的集合a,和乙個整數i,1 i n。輸出,元素x屬於a,且a中恰好有i 1個其他元素小於它。9.1 最大值和最小值 尋找乙個陣列中的最大值和最小值需要經過n 1次比較找到 def minimum a mini a...