现在的位置: 首页 > 综合 > 正文

算法导论——第六章——中位数和顺序统计学

2013年02月27日 ⁄ 综合 ⁄ 共 1139字 ⁄ 字号 评论关闭

 1.最大最小数

同时找到最大最小数最优算法首先让所有的元素参与两两比较,这样总共比较了n/2次,最大数肯定在胜者组中,最小数肯定在败者组中;然后从容量为n/2的胜者组中找到最大的数,最少要比较n/2 - 1次;同理,从容量为n/2的败者组中找到最小的数,最少要比较n/2 - 1次。所以总共需要比较(3n/2)
- 2 
次。以上假设n为偶数。奇数同理。
2.N个数中第k小的数
按照类似快速排序算 法中的“分类”步骤,任选一个参考数,把整个数组分成左右两部分。左边部分小于参考数,右边部分大于参考数。然后根据左右部分各自包含元素的个数,计算出
要求的元素在哪个数组中。(要求的元素或者是左数组中的第k小数,或者是右数组中第[k-l]小的数。l为左数组的长度)然后递归之。
平均情况下时间复杂度是Θ(n)

01 
02 int partition(int start, int end)
03 {
04     int i, j, pivot=a[start], temp;
05     i = start;
06     j = end;
07 
08     while (i < j)
09     {
10         while (a[i] <= pivot && i < endi++;
11         while (a[j] >= pivot && j > startj--;
12         if (i < j)
13         {
14             temp = a[i];
15             a[i] = a[j];
16             a[j] = temp;
17         }
18     }
19     a[start] = a[j];
20     a[j] = pivot;
21     return j;
22 }
23 
24 
25 int order_statistic(int start, int end, int k)
26 {
27     // 用partition函数把序列分成两半,中间的pivot元素是序列中的第i个
28     int i = partition(start, end);
29     if (k == i)
30         return i   //
返回找到的元素

31     else if (k > i)
32         order_statistic(i+1, end, k);    //
从后半部分找出第k-i小的元素并返回

33     else
34         order_statistic(start, i-1, k);    //
从前半部分找出第k小的元素并返回

35 }

抱歉!评论已关闭.