在乙個由n個元素組成的集合中,第i個順序統計量是該集合中第i小的元素。乙個中位數是它所屬集合的「中點元素」。當n為奇數時,中位數是唯一的,位於i=(n+1)/2處;當n為偶數時,存在兩個中位數,分別位於i=n/2和i=n/2+1處。如果不考慮n的奇偶性,中位數總是出現在i=⌊(n+1)/2⌋處(下中位數)和i=⌈(n+2)/2⌉(上中位數)。
1、最小值和最大值
在乙個有n個元素的集合中,需要做n-1次(上界)比較才能找到最小值或最大值。
int minivalue(const那麼如何同時找到最小值和最小值呢?int *a, int
len)
}return
minvalue;
}
比較簡單的思路是:只要分別獨立找出最大值和最小值,各需要n-1次比較,共需2n-2次比較。下面給出乙個演算法,只需要最多3⌊n/2⌋次比較就可以同時找到最大值和最小值。
思路是:記錄已知的最大值和最小值,對輸出元素成對地進行處理。
(1)首先,將一對輸入元素相互比較,然後將較小的與當前最小值比較,較大的與當前最大值比較,這樣每對元素共需3次比較。
(2)如果n是奇數,將最小值和最大值的初值都設為第乙個元素的值,然後成對地處理餘下的元素;如果n是偶數,就對前兩個元素做一次比較,決定最大值和最小值的初值,然後成對地處理餘下的元素。
1如果n是奇數,共進行3⌊n/2⌋次比較。如果n是偶數,共進行3(n-2)/2+1=3n/2-2次比較。void minmaxvalue(const
int *a, int len, int &minvalue, int &maxvalue)211
else
1217
18for (; i < len; i += 2)19
25else
2630
31if (tmpmin
3235
36if (maxvalue
3740
}41 }
2、期望為線性時間的選擇演算法
下面介紹一種解決選擇問題的分治演算法。
#include using說明:namespace
std;
int randomizedpartition(int *a, int low, int
high)
}a[high] = a[i + 1
]; a[i + 1] =key;
return i + 1;}
int randomizedselect(int *a, int low, int high, int
i)
int q =randomizedpartition(a, low, high);
int k = q - low + 1
;
if (i ==k)
else
if (i
else}//
test
intmain()
;
for (int i = 1; i <= 10; ++i)
cout
<
return0;
}
(1)randomizedselect的最壞執行時間為
,因為每次劃分時可能總是按餘下的元素中最大的來進行劃分,而劃分操作需要
時間。(2)與快速排序不同的是,快速排序會遞迴處理劃分的兩邊,而randomizedselect只處理劃分的一邊,這一差異體現在效能上就是快速排序的期望執行時間為
,而randomizedselect的期望執行時間為
。3、最壞情況為線性時間的選擇演算法
下面介紹乙個最壞情況執行時間為o(n)的選擇演算法select。
步驟1:將輸入陣列的n個元素劃分為⌊n/5⌋組,每組5個元素,且至多只有一組由剩下的n mod 5個元素組成。
步驟2:尋找這⌈n/5⌉組中每一組的中位數:首先對每組元素進行插入排序,然後確定每組有序元素的中位數。
步驟3:對步驟2中找出的⌈n/5⌉個中位數,遞迴呼叫select以找出其中位數x。
步驟4:利用修改過的partition版本,按中位數的中位數x對輸入陣列進行劃分。
步驟5:k為劃分的低區元素個數+1。如果i=k,返回x;如果ik,則在高區遞迴查詢第i-k小的元素。
說明:select演算法通過對輸入陣列的遞迴劃分來找出所需元素,在該演算法中能夠保證得到對陣列的乙個好的劃分。select使用的也是快速排序的確定性劃分演算法partition,做的修改是將劃分的主元也作為輸入引數。
演算法導論之中位數和順序統計量(3)
在乙個由n個元素組成的集合中,第i個順序統計量是該集合中的第i小的元素。本章的演算法正是找出乙個互異的元素集合中的第i小的元素。單個的最小值和最大值 在乙個有n個元素的集合中,我們要確定其中最小的元素,必須要進行n 1次比較,正如minmum a 演算法顯示的這樣 minmun a min a i ...
演算法導論 9 中位數和順序統計量
乙個中位數是它所屬集合的中點元素 9.1.1 在乙個有n個元素的集合中,需要做多少次比較才能確定其最小元素呢 9.1.2 同時找到最小值和最大值 實現 同時求解最大值和最小值 123 4567 891011 1213 1415 1617 1819 2021 2223 2425 26 def mini...
演算法導論 中位數和順序統計量之選擇演算法
實際生活中,我們經常會遇到這類問題 在乙個集合,誰是最大的元素?誰是最小的元素?或者誰是第二小的元素?等等。那麼如何在較短的時間內解決這類問題,就是本文要闡述的。先來熟悉幾個概念 1 順序統計量 在乙個由n個元素組成的集合中,第i個順序統計量 order statistic 是該集合中第i小的元素。...