寻找数组中最大值和最小值
2015-09-05 10:38
337 查看
题目来源:《编程之美》2.10
题目:同时找出数组中的最大数和最小数
分析:最基本的方法是两次线性扫描数组,分别找出最大数和最小数,时间复杂度为O(n)。其实我们可以一次扫描即可。首先,我们将输入元素相互进行比较,然后把较小的与当前最小值比较,把较大的与当前最大值进行比较。这样,对每两个元素共需3次比较。
如何设定已知的最大值和最小值的初始值依赖于n是奇数还是偶数。如果n是奇数,我们就将最大值和最大值的初值都设定为第一个元素的值,然后成对地处理余下的元素。如果n是偶数,就将对前两个元素做一次比较,以决定最大值和最小值的初值,然后与n是奇数的情形一样,成对地处理余下的元素。
下面分析一下总的比较次数。如果n是奇数,那么总共进行3⌊n/2⌋次比较。如果n是偶数,则是先进行一次初始比较,然后进行3(n-2)/2次比较,总共3n/2-2此次比较。因此,不管哪一种情况,总的比较次数至多是3⌊n/2⌋。
参考资料:《算法导论》第九章 中位数与顺序统计量
题目:同时找出数组中的最大数和最小数
分析:最基本的方法是两次线性扫描数组,分别找出最大数和最小数,时间复杂度为O(n)。其实我们可以一次扫描即可。首先,我们将输入元素相互进行比较,然后把较小的与当前最小值比较,把较大的与当前最大值进行比较。这样,对每两个元素共需3次比较。
如何设定已知的最大值和最小值的初始值依赖于n是奇数还是偶数。如果n是奇数,我们就将最大值和最大值的初值都设定为第一个元素的值,然后成对地处理余下的元素。如果n是偶数,就将对前两个元素做一次比较,以决定最大值和最小值的初值,然后与n是奇数的情形一样,成对地处理余下的元素。
下面分析一下总的比较次数。如果n是奇数,那么总共进行3⌊n/2⌋次比较。如果n是偶数,则是先进行一次初始比较,然后进行3(n-2)/2次比较,总共3n/2-2此次比较。因此,不管哪一种情况,总的比较次数至多是3⌊n/2⌋。
参考资料:《算法导论》第九章 中位数与顺序统计量
#include<iostream> using namespace std; void FindMaxAndMin(int a[], int len, int *max, int *min) { if (a == NULL || len <= 0) return; if (len == 1) { // 只有一个元素的时候 *max = *min = a[0]; return; } *max = 0; *min = 0; long temp_min = 0; long temp_max = 0; int index = 0; if (len & 1 ==0) { //如果是偶数个元素 index = 2; if (a[0] < a[1]) { *min = a[0]; *max = a[1]; } else { *min = a[1]; *max = a[0]; } } else { index = 1; *min = *max = a[0]; } for (; index < len - 1; index++) { temp_min = a[index] < a[index+1] ? a[index] : a[index+1]; temp_max = a[index] + a[index+1] - temp_min; *min = *min < temp_min ? *min : temp_min; *max = *max > temp_max ? *max : temp_max; } } int main() { int a[] = {}; int b[] = {1}; int c[] = {1,2,3,4,5}; int d[] = {1,2,3,4,5,6}; int min = 0; int max = 0; FindMaxAndMin(d, sizeof(d) / sizeof(int), &max, &min); cout<<max<<" "<<min<<endl; return 0; }
相关文章推荐
- PHP中读取文件的几个方法
- Hopfield's associative memory network
- Spinner的用法
- 使用接口求图形的周长与面积
- HDU1937 Finding Seats(dp求最小矩形)
- Palindrome - URAL - 1297(求回文串)
- 2015年-年终总结
- swift 代码笔记2
- CURL抓取网页内容并用正则提取。
- 二级c++——基本操作题小结
- 【codeforces 29A】Spit Problem
- 将你的Vim 打造成轻巧强大的IDE
- hdu1500 (排序+单调队列优化 )
- window 给链接加下划线或取消下划线
- Ajax-JS
- HDU 1150
- Unity3d通用工具类之生成文件的MD5
- POJ 2083 Fractal
- 基于SCN的查询(AS OF SCN)
- Unity3d通用工具类之生成文件的MD5