版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/melody_1016/article/details/83184570
练习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;
}
测试结果: