算法导论——第六章——中位数和顺序统计学
2011-11-21 20:55
381 查看
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 < end) i++;
11 while (a[j] >= pivot && j > start) j--;
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 }
同时找到最大最小数最优算法:首先让所有的元素参与两两比较,这样总共比较了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 < end) i++;
11 while (a[j] >= pivot && j > start) j--;
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 }
相关文章推荐
- 算法导论学习笔记-第九章-中位数和顺序统计学
- 【算法导论 第9章 中位数和顺序统计学】
- 【算法导论 第9章 中位数和顺序统计学】
- 排序和顺序统计学(算法导论)
- 中位数和顺序统计(线性时间)算法导论9.2
- 第九章中位数和顺序统计学之“查找第i小的元素(递归版)平均运行时间为O(n)算法”
- 第九章中位数和顺序统计学 之 “寻找第i小元素之最坏情况线性时间的选择 最坏运行时间就为O(n)算法”
- 《算法导论》读书笔记之第9章 中位数和顺序统计学 最坏情况是线性时间的选择算法
- 第九章中位数和顺序统计学之“查找第i小的元素(迭代版)平均运行时间为O(n)算法”(练习9.2-3)
- [算法学习] 中位数和顺序统计学
- 算法导论 第9章 中位数和顺序统计学(线性时间选择算法)
- 算法导论 第9章 排序和顺序统计学算法导论
- 算法导论 第9章 中位数和顺序统计学(线性时间选择算法)
- 算法导论第9章中位数和顺序统计学
- 顺序统计学(算法导论第九章)
- 《算法导论》第九章----中位数和顺序统计学
- 中位数和顺序统计量---算法导论学习笔记
- 算法导论第六章 堆排序
- [算法导论 Ch9 中位数和顺序统计量] Selection in O(n)
- 《算法导论》读书笔记之第9章 中位数和顺序统计学