分治算法的学习笔记

分治算法应用一:汉诺塔问题

问题描述:

汉诺塔问题来源于一个古老的传说,世界刚被创建的时候,有一座钻石宝塔,上面有64个金碟,所有碟子按照从大到小的顺序从塔底堆到塔顶,从世界创世开始,牧师们一直在努力将塔A的碟子借助B移到C上,每次只能移动一个,而且不能让小的放在大的下面

原理:

对汉诺塔问题的求解简化为以下步骤

  1. 将塔A上n-1个盘子借助塔C先移到塔B上
  2. 将塔A剩下的一个盘子移到塔C上
  3. 将n-1个碟子从B借助A移动到塔C上

代码描述:
void han(int n,char A,char B,char C)

{

if(n==1)Move(A,C);

else

{

  han(n-1,A,C,B);

Move(A,C);

han(n-1,A,B,C);

}

}

分治算法应用二:排序问题

问题描述:给出一系列的随机数并对其按照从大到小或者从小到大的顺序进行排列

二分排序是指利用二分法的思想对插入排序进行改进的一种插入排序算法,不同于二叉排序,可以利用数组的特点快速定位指定索引的元素。

一组数据中的第一个与其他所有数据比较将整个数据分为两个部分,左边的小于这个数右边的大于这个数。再分别对这两部分进行快速排序,递归进行直到排序完成。

int BinarySearch(int *arr,int len,int num)//二分法查找  

{  

    int left=0;  

    int right=len-1;  

    int mod;  

    if(num>arr[right]||num<arr[left])  

        return -1;  

    while(left<=right)  

    {  

        mod=(left+right)/2;  

        if(arr[mod]>num)  

            right=mod-1;  

        else if(arr[mod]<num)  

            left=mod+1;  

        else  

            return mod+1;   }

    return -1;  }

void Partition(int *a,int low, int high)//快速排序法进行排序  

{  

    if(low>high)  

    {  

        return;      }  

    int first=low;  

    int last=high;  

    int key=a[first];  

    while(first<last)  

    {  

        while(first<last&&key<=a[last])  

        {  

            last--;  

        }          a[first]=a[last];  

    }  

    a[first]=key;  

    Partition(a,low,first-1);  

    Partition(a,first+1,high);  

}  

 

分治算法应用伪币问题

给你一个装有1 6个硬币的袋子。1 6个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。你的任务是找出这个伪造的硬币。

void maxmin2(int A[],int i,int j,int *max,int *min)

{ int mid,max1,max2,min1,min2;

if (j==i) {最大和最小值为同一个数;return;}

if (j-1==i) {将两个数直接比较,求得最大和最小值;return;}

mid=(i+j)/2;

求i~mid之间的最大最小值分别为max1,min1;

求mid+1~j之间的最大最小值分别为max2,min2;

比较max1和max2,大的就是最大值;

比较min1和min2,小的就是最小值;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值