求一个数组当中最大(最小)值的两种计算方法
求一个数组当中最大(最小)值的两种计算方法
1、常用方法(以求最大值为例)
1 #include "stdafx.h" 2 #include <string> 3 using namespace std; 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 int a[5] = { 1, 23, 2, 6, 7 }; 7 int array_length = sizeof(a) / sizeof(a[0]);//数组大小 8 int max=a[0]; 9 for (int i = 1; i < array_length; i++) 10 { 11 if (a[i]>max) 12 { 13 max = a[i]; 14 } 15 } 16 printf("数组a的最大值为%d", max); 17 getchar(); 18 return 0; 19 }
2、同时寻找最大值和最小值
一种思路是将上述常见的寻找最大值和最小值算法分别运行一遍就可以分别将最大值和最小值找出来,这样的话在输入情况最差的情况下面,算法运行的时间复杂度为O(2n)。另外的一种思路是同时对数组当中连续的两个数字进行比较,取其中较大的和临时最大值作比较、取其中最小的和临时最小值作比较,直到数组最后遍历完成,就可以获得最大值最小值了。这种算法在最坏的情况下的时间复杂度为O(3[n/2])([n/2]代表向下取整),算法实现如下:
1 #include "stdafx.h" 2 #include <string> 3 using namespace std; 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 int a[9] = { 3, 2, 6, 1, 7, 10, 13, 9 ,20}; 7 int array_length = sizeof(a) / sizeof(a[0]);//数组大小 8 int max=-10000;//临时最大值 9 int min=10000;//临时最小值 10 for (int i = 0; i < array_length && i+1<array_length; i=i+2) 11 { 12 if (a[i] < a[i + 1]) 13 { 14 if (a[i] < min) 15 { 16 min = a[i]; 17 } 18 if (a[i + 1]>max) 19 { 20 max = a[i + 1]; 21 } 22 }else{ 23 if (a[i+1] < min) 24 { 25 min = a[i+1]; 26 } 27 if (a[i]>max) 28 { 29 max = a[i]; 30 } 31 } 32 } 33 //如果数组的大小为基数就要对数组当中的最后一个值单独拿出来做一次判断 34 if (array_length % 2 != 0) 35 { 36 if (a[array_length - 1] < min) 37 { 38 min = a[array_length - 1]; 39 } 40 if (a[array_length - 1] > max) 41 { 42 max = a[array_length - 1]; 43 } 44 } 45 printf("数组a的最大值为%d,最小值为%d", max, min); 46 getchar(); 47 return 0; 48 }
3、寻找一个数组当中第i小的数字
思路其实很简单,将数组做一次非递减排序,然后找到排好序当中的第i个数即可。排序算法的相关内容可以查看笔者的这一篇博客。