練習7-2 求最大值及其下標
阿新 • • 發佈:2018-12-16
練習7-2 求最大值及其下標 (20 分)
本題要求編寫程式,找出給定的n個數中的最大值及其對應的最小下標(下標從0開始)。
輸入格式:
輸入在第一行中給出一個正整數n(1<n≤10)。第二行輸入n個整數,用空格分開。
輸出格式:
在一行中輸出最大值及最大值的最小下標,中間用一個空格分開。
輸入樣例:
6
2 8 10 1 9 10
輸出樣例:
10 2
思路一:先遍歷一邊陣列找出最大值max;然後以max作為另一個函式的引數,再遍歷一邊陣列,將max與每一個數字進行比較,找出最小下標。
程式碼:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> //思路一:(1)將數字存入陣列中,先遍歷陣列找出最大值max; //(2)將最大值max作為引數,在另一個函式中再遍歷陣列,將每一個值與max比較,找出最小下標 int FindMaxNum(int a[], int n) { int max = a[0]; for (int i = 1; i < n; i++) { if (a[i]>max) { max = a[i]; } } return max; } //找最大值的最小下標 int FindIndex(int a[], int n, int max) { int index = 0; for (int i = 0; i < n; i++) { if (a[i] == max) { index = i; break; } } return index; } int main() { int arr[10] = { 0 }; int n = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } int _max = FindMaxNum(arr, n); int _index = FindIndex(arr, n, _max); printf("%d %d\n", _max, _index); system("pause"); return 0; }
測試結果:
缺點:遍歷了2遍陣列,時間複雜度較高。
優化方案:index儲存最大值所在的最小下標,arr[index]即為最大值;遍歷一遍陣列,邊遍歷邊比較數值大小,不斷更新index,最後index就是最大值的最小下標,arr[index]為最大值。這樣時間複雜度就降為O(n)
程式碼:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> //思路二:O(n)時間複雜度 //index儲存最大值所在的最小下標,arr[index]即為最大值; //遍歷一遍陣列,邊遍歷邊比較數值大小,不斷更新index,最後index就是最大值的最小下標,arr[index]為最大值 int Find_Maxnum_index(int a[], int n) { int index = 0; for (int i = 1; i < n; i++) { if (a[i]>a[index]) { index = i; } } return index; } int main() { int arr[10] = { 0 }; int n = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } int _index = Find_Maxnum_index(arr, n); printf("%d %d\n", arr[_index], _index); system("pause"); return 0; }
測試結果: