实验一 分治算法

一、实验目的与要求

1、熟悉二分搜索算法;

2、掌握分治算法;  

3、能对设计的算法进行复杂度分析。

二、实验题目

1、最多约数问题。正整数x的约数是能整除x的正整数,正整数x的约数个数记为div(x)。例如:1,2,5,10都是10的约数,且div(10)=4。设a和b是2个正整数,a≤b,找出a和b之间约数个数最多的数x。

2、设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

三、实验步骤

1、算法思想描述

  1. 用C/C++实现的程序代码、

  1. 运行结果

一、

#include<iostream>

#include<stdio.h>

int countsum(int n)

{

int count=0;

for(int i=1;i<=n;i++)

{

if(n%i==0)

{

count++;

}

}

printf("%d的约数有%d个\n",n,count);

return count;

}

int main()

{

int max=0;

int maxnum=0;

int minnum=0;

int a;

int b;

printf("请输入要比较的两个数:\n");

scanf("%d",&a);  

scanf("%d",&b);

maxnum=countsum(a);

minnum=countsum(b);

max=(maxnum-minnum)>0?a:b;

printf("约数个数最多的数为%d\n",max);                                                                                                     

}

二、

#include<stdio.h>

#include<stdlib.h>

int search(int a[],int length,int x)

{

int i=0,j=0;

int detection=-1;

int top=length-1;

int middle=0;

int low=0;

while(low<=top)

{

middle=(low+top)/2;

if(a[middle]==x)

{

detection=middle;

}

if(a[middle]<x)

{

low=middle+1;

}

else

{

top=middle-1;

}

}

if(detection==-1)

{

i=top;

j=low;

}

else

{

i=detection;

j=i;

}

printf("i的值为:%d\nj的值为:%d\n",i,j);

return 0;

}

int main()

{

int arr[]={5,23,24,36,48,55,60,100};

int length=sizeof(arr)/sizeof(int);

search(arr,length,2);

system("pause");

}

四、实验小结

分治算法是一种把问题分成多个子问题,然后将子问题的解合并起来得到原问题解的算法。通常情况下,分治算法可以分为三个步骤:分解、解决和合并。在本次实验中,我们将使用分治算法解决一个经典的问题:求解一个数组中的最大值。 1.问题描述 给定一个数组,我们需要找到其中的最大值。 2.算法设计 我们使用分治算法解决这个问题。具体来说,我们将数组分成两个子数组,然后递归地对这两个子数组求解最大值,最后将两个子数组的最大值合并起来得到原数组的最大值。 具体的算法步骤如下: (1)将数组分成两个子数组,分别求解其中的最大值。 (2)将两个子数组的最大值进行比较,得到原数组的最大值。 3.实验过程 为了实现这个算法,我们需要编写一个递归函数。该函数将在不断地对子数组进行分解,直到子数组的长度为1时,返回子数组中的唯一元素。 在进行合并时,我们需要比较两个子数组的最大值,然后将较大的值作为结果返回。 下面是具体的代码实现: ``` // 分治算法求解最大值 int max(int arr[], int start, int end) { // 如果子数组长度为1,返回该元素 if (start == end) { return arr[start]; } // 将数组分成两个子数组 int mid = (start + end) / 2; int left = max(arr, start, mid); int right = max(arr, mid + 1, end); // 合并两个子数组的结果 return left > right ? left : right; } ``` 4.实验结果 我们使用一个长度为10的随机数组进行测试,如下所示: ``` int arr[] = {9, 4, 7, 8, 6, 2, 10, 3, 5, 1}; int result = max(arr, 0, 9); cout << "The max value in the array is " << result << endl; ``` 运行结果如下: ``` The max value in the array is 10 ``` 可以看到,我们成功地使用分治算法求解了给定数组的最大值。 5.实验总结 本次实验我们学习了分治算法的基本思想,并且使用分治算法成功地求解了一个经典问题分治算法可以解决很多复杂的问题,例如排序、查找等,它的时间复杂度通常可以达到O(nlogn)。因此,在算法设计中,我们可以考虑使用分治算法解决一些复杂的问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值