1、 汉诺塔问题
【问题描述】有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动,设移动次数为H(n)。
【问题分析】先考虑两个盘子时的情况,只有两个盘子的时候只需要将上面的盘子移到C柱子上,然后将下面的盘子移动到B柱子上,再将C柱子上的盘子移到B柱子上,这样就完成了整个的移动。
将整个过程描述为:以C柱子为辅助,将A柱子上的盘子移动到B柱子上。再考虑三个或者三个以上的情况,也就是将最上层的盘子当成一个盘子,然后下层的盘子都看做一个盘子,完成一次之后再循环下去,递归的思想就这样可以用进去了。
【代码实现】
#include <iostream>
using namespace std;
void hanoi(int n, char a, char b, char c)
{
if(n > 0)
{
//先把A上面的n-1个盘子移到C上
hanoi(n-1, a, c, b);
//把A最下面的(也就是最后一个)移动到B上
cout<< a << "-->" << b << endl;
//最后把C上的n-1个盘子移到B上
hanoi(n-1, c, b, a);
}
}
int main()
{
hanoi(5,'A','B','C');
return 0;
}
2、 二分查找
【算法思想】
在有序表中,查找给定数可以先查找有序表的中间元素是否和给定数一致,[1]一致则完成查找,[2]如果不一致那么根据有序表中间元素和给定数的大小关系可以确定给定数该在有序表的左侧查找还是右侧查找,依次循环下去就可以完成整个的查找过程。
二分查找最坏情况下的时间复杂度是O(log(n))。
【代码实现】
#include <iostream>
using namespace std;
template<class Type>
int binary_Search(Type a[],const Type& x,int n)
{
int left = 0;
int right = n-1;
while(left <= right)
{
int middle = (left + right)/2;
cout<<a[middle]<<endl;
if(x == a[middle]) return middle;
if(x > a[middle])
left = middle + 1;
else
right = middle - 1;
}
return -1;
}
int main()
{
int tm[20];
for(int i = 0;i<20;i++)
{
tm[i] = i + 1;
}
cout<<binary_Search(tm,14,20)<<endl;
system("pause");
return 0;
}