经典编程问题之:选择排序、冒泡排序、汉诺塔游戏,均用js代码实现
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');
總結
以上是生活随笔為你收集整理的经典编程问题之:选择排序、冒泡排序、汉诺塔游戏,均用js代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: maven打包不用eclipse插件
- 下一篇: 去除某个元素的属性