java数据结构和算法--------第六章

三角数字

给定一串数字1,3,6,10,15,21.......是否能推出后面几项的值呢。

显然第N项的值等于第N-1项+N

a[N]=a[N-1]+N该种数列被称为三角形数字。

由此可以根据规律计算第N项的值。可以使用循环的方法来计算第N项的值

int triangle(int n)

{

   int total=0;

   while(n>0)

     {

         total=total+n;

         --n;

      }

    return total;

}

使用循环的方法来算挺好,但是可以考虑用递归,正如两幅图之间对比的那样。

int triangle(int n)

{

   return (n+triangle(n-1));

}

但是显然上面的程序永远不会结束,陷入了一个庞氏骗局,因为没有终止的条件。

int triangle(int n)

{

   if(n=1)

   return 1;

else

   return (n+triangle(n-1));

}

为了清楚地观察到递归函数的执行过程,程序中加入了测试语句。可以看到整个递归的调用过程。

 

 

通过上面的三幅图看到整个递归程序的执行过程。

阶乘

阶乘实际上就是把上面三角形的问题,稍微改变一下。

递归的二分查找

下面两幅图对比,可以看到我们将递归插入到了二分查找中

图二实质上是一种分治算法,把原来的大问题,细分为一个个的小问题。这样小问题便于求解。

汉诺塔问题

递归的算法

归并排序

冒泡排序,插入排序,选择排序三者的时间复杂性是O(N^2)

归并排序的时间复杂性是O(N*lgN),显然它比前面几个都要快,但是归并排序有一个缺点

需要较大的存储空间。

归并两个有序数组

归并算法的中心是归并两个各自有序的数组,将其合成一个全新的按大小顺序排列的数组。

一般的归并排序,两个指针指向各自的元素,小的进来,指针后移。直到其中一方数据为空。复制另一方剩余的数据。

通过归并进行排序

 

posted on 2017-02-23 18:30  毛无语666  阅读(200)  评论(0编辑  收藏  举报

导航