实验目的:
通过本次实验,了解分治法策略基本思想,掌握分治法在实际问题中使用方法。
实验环境:
硬件: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;
}
运行结果