经典编程问题之:选择排序、冒泡排序、汉诺塔游戏,均用js代码实现

来源:互联网 发布:java生产者和消费者 编辑:程序博客网 时间:2024/06/06 09:13

1.       排序问题

a)      选择排序

//选择排序,第一个和逐一和后面每个数比较,比较后交换使得第一个数成为较大/小值后,第一个数后面所有数比较完了就得到了最大/小值(第一趟比较完毕),然后第二个和后面每个数比较得到 第二大/小值。。。

var a=[10,1,29,8,19,11,20,12,56,78];

for(var i=0;i<a.length-1;i++){

    for(var j=i+1;j<a.length;j++){

          if(a[i]>a[j]){

               var temp ;

               temp = a[i] ;

               a[i]  = a[j];

               a[j]=temp;

          }

    }

}

a;

b)      冒泡排序

//冒泡排序,第一个和第二数个比较大小,根据比较情况选择是否冒泡(交换位置),

第二个数和第三个数比较,根据比较情况选择是否冒泡(交换位置)。。。第一趟比较完毕,最大/小值已放到最最后一位,然后第二趟

var a=[10,1,29,8,19,11,20,12,56,78];

for(var i=0;i<a.length;i++){//控制循环趟数

     for(varj=0;j<a.length-1;j++){//每趟进行冒泡比较

          if(a[j]>a[j+1]){

                var temp ;

                temp = a[j] ;

                a[j]  = a[j+1];

                a[j+1]=temp;

          }

     }

}

a;

上面代码虽然可以实现冒泡排序的效果,但是不够优化

如果冒泡排序10个数,只需要循环9趟即可,因为循环第10趟是排序已经排好。再就是外循环跑一趟,实际上已经把最大/小值冒泡到最后位置,所以内循环进行冒泡排序不在需要和已经冒泡好的数据进行比较。

故此,优化后的代码是:

var a=[10,1,29,8,19,11,20,12,56,78];

for(var i=0;i<a.length-1;i++){//控制循环趟数,排序数字个数减一

//每趟进行冒泡比较,已经冒泡的数字不在循环比较

     for(varj=0;j<a.length-1-i;j++){        

if(a[j]>a[j+1]){

                var temp ;

                temp = a[j] ;

                a[j]  = a[j+1];

                a[j+1]=temp;

          }

     }

}

a;

1.       汉诺塔问题


这是典型的函数递归调用问题

1)  当A塔上只有1个圆盘,可直接从A—>C。

2)  当A塔上有2个圆盘, A—>B(小圆盘),A—>C(大圆盘),B—>C(小圆盘)。

当有2个圆盘时,需要借助B柱子进行转换。

3)  当我们有很多圆盘时,我们可以看做2个圆盘,最下面的大圆盘 和其上面的所有圆盘当做小圆盘。这样我们就可以用函数递归调用了。

比如A柱上有10个圆盘,我们需要把A柱10号大圆盘 上所有圆盘移动 B柱,这样10号大圆盘盘就可以移动到C柱。我们想要把10号圆盘上的所有圆盘移动到B柱,我们就需要把9号圆盘上所有圆盘移动到A柱,这样9号圆盘就可以移动到B柱。感觉有点说不清,画个图:


/**

*@param num 盘子数

*@param A 当前柱子

*@param B 中间柱子

*@param C 目标柱子

*/

function  hanLuo(num,A,B,C){

     if(num==1){

          console.log(A+'-->'+C);//只有一个盘子A-->C

}else{

     hanLuo(num-1,A,C,B);//将num-1个盘子从A-->B

     console.log(A+'-->'+C);   //将最下面的盘子(num)盘子,从A柱子移动到C柱子   

     hanLuo(num-1,B,A,C)//将num-1个盘子从B-->C

}

}

hanLuo(2,'A','B','C');

 

function  hanLuo(num,A,B,C){

     if(num==1){

          returnA+'-->'+C+',';//只有一个盘子A-->C

}else{

     var str1 =hanLuo(num-1,A,C,B);//将num-1个盘子从A-->B

     var str3 =A+'-->'+C+','; //将最下面的盘子(num)盘子,从A柱子移动到C柱子   

     var str2 =hanLuo(num-1,B,A,C)//将num-1个盘子从B-->C

     return str1+str3+str2;

}

}

hanLuo(2,'A','B','C');


0 0
原创粉丝点击