1. 程式人生 > >練習7-2 求最大值及其下標

練習7-2 求最大值及其下標

練習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;
}

測試結果: