分治算法应用一:汉诺塔问题
问题描述:
汉诺塔问题来源于一个古老的传说,世界刚被创建的时候,有一座钻石宝塔,上面有64个金碟,所有碟子按照从大到小的顺序从塔底堆到塔顶,从世界创世开始,牧师们一直在努力将塔A的碟子借助B移到C上,每次只能移动一个,而且不能让小的放在大的下面
原理:
对汉诺塔问题的求解简化为以下步骤
- 将塔A上n-1个盘子借助塔C先移到塔B上
- 将塔A剩下的一个盘子移到塔C上
- 将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,小的就是最小值;
}