求一個數組當中最大(最小)值的兩種計算方法
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個數即可。排序算法的相關內容可以查看筆者的這一篇博客。