了解分治策略的思想以及用相应算法解决实际问题

1.对于规模较大且不能直接解决的问题,可先分解为若干个规模较小,相互独立且与原问题同质的子问题,合并子问题的解就可以得到原问题的解。使用递归的思想来解题。

适用的前提(必须同时具备两个特征)

1.原问题可以分解成若干个规模较小,相互独立且与原问题同质的子问题。

2.规模减小到一定程度时的子问题可以直接解决。

若子问题并不相互独立,可以使用动态规划来解决。

二分搜索法

1.非递归解法

int main()
{
    int n;
    int arr[] = { 1,3,4,5,6,7,8,12,15,17 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    printf("请输入要查找的数");
    scanf("%d", &n);
    int left = 0;
    int right = sz - 1;
    while (left <=right)
    {
        int mid = (left + right)/2;
        if (n<arr[mid])
        {
            right= mid-1;
        }
        else if(n>arr[mid])
        {
            left = mid+1;
        }
        else if (n==arr[mid])
        {
            printf("找到那个数了,下标为:%d", mid);
            break;
        }
    }
}

2.用递归的思想解决

int binary_search(int*arr,int left,int right,int n)
{
    if (left <= right)
    {
        int mid = (left + right) / 2;
        if (arr[mid] > n)
        {
            return binary_search(arr, left, mid - 1, n);
        }
        else if (arr[mid] < n)
        {
            return binary_search(arr, mid + 1, right, n);
        }
        else if (arr[mid] == n)
        {   
            return mid;
        }
    }
    return 0;

}
int main()
{
    int n = 0;
    int arr[] ={4,5,6,7,8,9,12,16,23,25};
    int sz = sizeof(arr) / sizeof(arr[0]);
    int left = 0;
    int right = sz - 1;
    printf("请输入要寻找的数字:>");
    scanf("%d", &n);
    int ret=binary_search(arr, left, right, n);
    if (ret!=0)
    {
        printf("找到了,下标为:%d", ret);
    }
    else printf("找不到该数字");
}

程序运行的结果同上非递归的结果

​问题1 全排列:求n个元素的全排列。以1,2,3三个元素为例,全排列结果为:

编写的程序如下:

void f(int a[], int j, int k)

{

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值