穷举法求出无序序列的最大值以及次大值

本文介绍了如何通过C语言编程实现分治法解决求含n个实数序列中的最大元素和次大元素问题,详细阐述了递归过程和时间复杂度分析。
摘要由CSDN通过智能技术生成

实验目的:

通过本次实验,了解分治法策略基本思想,掌握分治法在实际问题中使用方法。

实验环境:

硬件:PC机

软件:windows操作系统,C语言

实验内容

设计一个程序,采用分治法求含n个实数序列中的最大元素和次大元素,并分析算法的时间复杂度。

代码如下

#include<stdio.h>
#include<stdlib.h>

//求两数中最大元素
int max(int a, int b)
{
	if (a > b)
	{
		return a;
	}
	else
	{
		return b;
	}
}

//求两数中最小元素
int min(int a, int b)
{
	if (a < b)
	{
		return a;
	}
	else
	{
		return b;
	}
}

void solve(int a[], int low, int high, int* max1, int* max2) {
	//如果只有一个元素
	if (low == high)
	{
		*max1 = a[low];
		*max2 = -1;
	}
	//如果有两个元素
	else if (low == high - 1)
	{
		*max1 = max(a[low], a[high]);
		*max2 = min(a[low], a[high]);
	}
	//如果有三个元素
	else
	{
		int mid = (low + high) / 2;
		int lmax1, lmax2;
		//求多个元素前半段最大与次大
		solve(a, low, mid, &lmax1, &lmax2);
		int rmax1, rmax2;
		//求多个元素后半段最大与次大
		solve(a, mid + 1, high, &rmax1, &rmax2);
		//前半段的最大大于后半段的最大
		if (lmax1 > rmax1)
		{
			*max1 = lmax1;
			*max2 = max(lmax2, rmax1);
		}
		//前半段的最大小于后半段的最大
		else
		{
			*max1 = rmax1;
			*max2 = max(rmax2, lmax1);
		}
	}
}

int main()
{
	int n;
	printf("请输入无序序列的元素个数");
	scanf("%d", &n);
	int* a = (int*)malloc(n * sizeof(int));
	printf("请输入数组元素");
	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	int max1;
	int max2;
	solve(a, 0, n-1, &max1, &max2);
	printf("最大元素是:");
	printf("%d\n", max1);
	printf("次大元素是:");
	printf("%d\n", max2);
	return 0;
}

运行结果

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值