亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript排序算法動畫演示效果的實現方法

2019-11-20 08:43:42
字體:
來源:轉載
供稿:網友

之前在知乎看到有人在問 自己寫了一個冒泡排序算法如何用HTML,CSS,JavaScript展現出來排序過程。   感覺這個問題還挺有意思 。前些時間就來寫了一個。這里記錄一下實現過程。

基本的思想是把排序每一步的時候每個數據的值用DOM結構表達出來。

問題一:如何將JavaScript排序的一步步進程展現出來?

我試過的幾種思路:

1.讓JavaScript暫停下來,慢下來。

JavaScript排序是很快的,要我們肉眼能看到它的實現過程,我首先想到的是讓排序慢下來。 排序的每一個循環都讓它停300ms然后再繼續進行。 怎么樣才能停下來呢。查了一下JavaScript貌似沒有sleep()這樣的函數。暫停做不到,但是可以想辦法讓實現跟暫停差不多的效果。比如在循環里做一些無關的事情 。

首先嘗試了讓while(true)來一直執行一個空操作。執行一段時間再回到排序邏輯。代碼大致是這樣:

for (var i = 0; i < 3; i++) {	document.writeln(i); //DOM操作 	var now = new Date().getTime(); 	while(new Date().getTime() - now < 3000){} }

慢是慢下來了。不過太耗資源,排序進行過程中dom并不會有任何改變,直到排序結束, DOM會變成排序好之后的樣子。  但是如果設置斷點一步步執行的時候 又可以看到一步步的排序變化。估計是因為這個操作太耗資源導致瀏覽器下達了一個DOM操作的命令但是一直騰不出資源來進行DOM操作。所以真正DOM操作的時候在js代碼執行結束之后。
所以讓JavaScript排序慢來來還是沒有實現。

另一種讓JavaScript暫停下來的思路:

寫這個文章的時候又想到一種方法來讓JavaScript停下來。 那就是AJAX的同步請求,以及超時操作。  也就是在要停下來的地方放一個AJAX請求,同步請求, 然后設置超時。超時的時間就是我們要暫停的時間。為了避免在到達超時請求之前服務 器就返回了我們的AJAX請求??梢栽诜斩诉\行類似 sleep()的程序 。從而保證AJAX不會返回。直接超時然后返回到我們的循環。不過這只是個設想。有興趣的可以去嘗試一下。

2.閉包和定時器。 這種思路不需要讓排序過程慢下來。而是使用閉包緩存排序過程中數組的變化。然后使用setTimeout來確定展示每一個數組狀態的順序。在排序循環中放入類似下面的代碼。

(function(){  var theArr = arr.slice();//當前數組狀態的備份  setTimeout(function(){    bubbleSortDom(theArr);//排序的DOM操作。  },500*timeCount);  timeCount++;//定時器的順序。})();

不過后來發現這樣子寫的話代碼量會比較大,邏輯有修改的話要修改的地方會有點多。局限性很多,比如要實現排序動畫加快或減慢操作幾乎是很困難的。所以還要另想辦法。

3.緩存排序中的數組狀態。  

也就是在排序過程中。將數組的每一輪循環的狀態保存到一個數組。然后再用這個數組依次將排序狀態保存下來。 只需要在排序中加入一句就行。

this.pushHis(arr.slice(),i-1,j,k,temp);

這樣就只需要一個setInterval()就可以了。并且可以很方便的實現動畫的加快與減慢。邏輯也比較好理解 。

問題二:如何實現JavaScript排序動畫的加快與減慢。

我們問題一使用的第三種方法。 得到一個保存了每一步排序狀態的數組arr。  然后我們可以使用一個setInterval()定時器一步步展現排序狀態。  如果要加快速度或減慢速度。就clearInterval(),修改定時器的執行間隔,重新setInterval(),從前一個定時器執行到數組中的位置開始執行。

問題三:對于使用遞歸實現的數組怎么辦? 不是在原數組上進行操作的怎么辦?

使用遞歸實現的排序。 可能并沒有在一個數組上進行操作,只是最后返回一個排序好的數組出來。那么我們要如何獲得排序中的數組的完整狀態呢。

比如快速排序。

最開始不考慮動畫,我的實現是這樣的:

function quickSort(arr){var len = arr.length,leftArr=[],rightArr=[],tag;if(len<2){return arr;}tag = arr[0];for(i=1;i<len;i++){if(arr[i]<=tag){leftArr.push(arr[i])}else{rightArr.push(arr[i]);}}return quickSort(leftArr).concat(tag,quickSort(rightArr));}

然后為了考慮動畫,我改寫了它的邏輯,讓它在同一個數組上進行了實現。 其實是在遞歸的時候傳入了當前的的子數組在原數組中的起始位置。從而在原數組上進行了操作。

用了兩種方法來實現方式。在排序邏輯上略有不同。

第一種是先跟遠處的對比。遇到比自己小的放到自己前面去。循環序號+1。比自己大的放到當前排序子數組的最后面去,循環序號不變。直到排列完成。 
這種方法的缺點是即使是一個有序數組。它也會重新排。

第二種方法是 除了標記位,再設置一個對比位。 遇到比自己小的,放到前面去,標記位的位置+1,標記位與對比位之間所有的往后面移動一個位置。
遇到比自己大的。標記位不變,對比位+1。
這種方法的缺點是對數組進行的操作太多。優點是對有序數組不會再排。

方式一:

function quickSort(arr,a,b,qArr){var len = arr.length,leftArr=[],rightArr=[],tag,i,k,len_l,len_r,lb,ra,temp;if(a == undefined && b == undefined){a = 0; b= arr.length-1;//初始化起始位置。}if(qArr == undefined){qArr = arr.slice();}if((len == 2 && arr[0] == arr[1])||len<2){return arr;}tag = qArr[a];for (i = 1; i < len;) {if(qArr[a+i]<=tag){leftArr.push(qArr[a+i]);qArr[a+i-1] = qArr[a+i];qArr[a+i] = tag;k = a+i;i++;}else{if(leftArr.length+rightArr.length == len-1){break;}temp = qArr[a+i];qArr[a+i] = qArr[b-rightArr.length];qArr[b-rightArr.length] = temp;rightArr.push(temp);k = a+i-1;}this.pushHis(qArr.slice(),a,b,k);}len_l = leftArr.length;len_r = rightArr.length;if(len_l== 0){lb = a;}else{lb = a+len_l -1;this.sort(leftArr,a,lb,qArr);}if(len_r == 0){ra = b;}else{ra = b + 1 - len_r;this.sort(rightArr,ra,b,qArr)}return qArr}

方式二:

function quickSort2(arr,a,b,qArr){   var len = arr.length,leftArr=[],rightArr=[],tag,i,j,k,temp,len_l,len_r,lb,ra;   if(a == undefined && b == undefined){     a = 0; b= arr.length-1;//初始化起始位置。   }   if(qArr == undefined){     qArr = arr.slice();   }   if(len<2){     return arr;   }   if(len == 2 && arr[0] == arr[1]){     return arr;   }   tag = qArr[a];   for (i = 1,k = 0; i < len;) {     if(qArr[a+i]>=tag){       rightArr.push(qArr[a+i]);       i++;     }else{       temp = qArr[a+i];       for(j = a+i;j>a+k;j--){         qArr[j] = qArr[j-1];         // this.pushHis(qArr.slice(),a,b,a+k);       }       qArr[a+k] = temp;       leftArr.push(temp);       k++;       i++;     }     this.pushHis(qArr.slice(),a,b,a+k,i-1);   }   len_l = leftArr.length;   len_r = rightArr.length;   if(len_l== 0){     lb = a;   }else{     lb = a+len_l -1;     this.sort(leftArr,a,lb,qArr);   }   if(len_r == 0){     ra = b;   }else{     ra = b + 1 - len_r;     this.sort(rightArr,ra,b,qArr)   }   return qArr; } 

具體的不同下面會有動畫演示。

問題四:動畫的流暢。

排序動畫的DOM操作是很多的很快的。這里我做的優化只是讓每一個排序步驟只涉及一個DOM操作。  全部由JavaScript拼接好,一次替換。類似下面的代碼。

效果圖:

主要實現了:

冒泡排序JavaScript動畫演示
插入排序JavaScript動畫演示
選擇排序JavaScript動畫演示
快速排序JavaScript動畫演示
歸并排序JavaScript動畫演示
希爾排序JavaScript動畫演示

以上就是小編為大家帶來的JavaScript排序算法動畫演示效果的實現方法全部內容了,希望大家多多支持武林網~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久女教师免费一区| 欧美黑人巨大xxx极品| 国产精品久久久久影院日本| 1769国内精品视频在线播放| 欧美在线亚洲一区| 992tv成人免费影院| 俺去亚洲欧洲欧美日韩| 亚洲欧洲自拍偷拍| 亚洲第一视频网站| 欧洲成人在线视频| 久久久噜久噜久久综合| 欧美激情亚洲精品| 91在线视频九色| 精品国产乱码久久久久久天美| 精品久久久精品| 国产色综合天天综合网| 精品视频在线观看日韩| 精品小视频在线| 亚洲图中文字幕| 日韩电影中文字幕av| 91精品久久久久久久久久另类| 日本乱人伦a精品| 欧美午夜影院在线视频| 欧美一级高清免费播放| 亚洲人成电影网站色www| 亚洲国产精品人久久电影| 97超视频免费观看| 91精品视频在线免费观看| 欧美激情视频免费观看| 亚洲激情在线观看视频免费| 91在线|亚洲| 精品久久久久久久中文字幕| 欧美怡红院视频一区二区三区| 精品视频久久久久久久| 日韩视频免费大全中文字幕| 久久久久久久久久国产精品| 国产91对白在线播放| 国产精品久久久久久久9999| 国产日韩欧美视频| 国产精品专区h在线观看| 国产精品久久77777| 国产精自产拍久久久久久| 久久久中精品2020中文| 日韩av电影手机在线观看| 亚洲成人精品在线| 97视频在线观看亚洲| 国产一区二区激情| 亚洲美女激情视频| 欧美理论电影在线观看| 国内精品久久久久久中文字幕| 欧美成人sm免费视频| 亚洲成**性毛茸茸| 国产精品久久久久久久久男| 日韩成人中文字幕在线观看| 亚洲人成亚洲人成在线观看| 欧美激情视频三区| 国产欧美精品久久久| 国产97在线|日韩| 久久影视电视剧免费网站清宫辞电视| 久久免费视频在线观看| 亚洲xxxx3d| 亚洲国内精品在线| 97av在线视频| 日本一区二区在线免费播放| 激情久久av一区av二区av三区| 国产91精品久久久久| 欧美最近摘花xxxx摘花| 亚洲欧美成人网| 欧美午夜片在线免费观看| 黄色精品一区二区| 一本大道香蕉久在线播放29| 日本欧美一级片| 国产丝袜一区视频在线观看| 国产精品aaaa| 亚洲精品久久久久久久久| 欧美电影在线免费观看网站| 亚洲视频在线免费看| 日韩成人性视频| 亚洲精品乱码久久久久久金桔影视| 青青草原成人在线视频| 美女黄色丝袜一区| 97国产精品视频人人做人人爱| 成人国产精品久久久久久亚洲| 亚洲国产古装精品网站| 91精品国产自产在线观看永久| 亚洲a级在线播放观看| 在线日韩精品视频| 国产精品91久久久久久| 97在线观看免费高清| 日韩免费在线观看视频| 欧日韩不卡在线视频| 97成人超碰免| 国内精品久久久久久| 国产精品久久久久影院日本| 日韩欧美精品免费在线| 欧美视频在线观看免费| 国产日韩中文字幕| 2024亚洲男人天堂| 亚洲精品动漫久久久久| 亚洲精品第一国产综合精品| 91久久久久久久久| 少妇久久久久久| 欧美香蕉大胸在线视频观看| 国产欧美久久久久久| 欧美亚洲另类激情另类| 亚洲成av人乱码色午夜| 欧美性生交大片免费| 亚洲成人精品av| 国产成人激情小视频| 午夜剧场成人观在线视频免费观看| 91日本在线视频| 成人在线一区二区| 日韩在线观看免费高清| 国产精品网红福利| 97人人爽人人喊人人模波多| 日韩精品免费在线视频| 国产在线视频2019最新视频| 欧美亚洲在线视频| 中文字幕亚洲一区在线观看| 精品国产一区二区三区久久| 欧美最猛性xxxxx免费| 亚洲国产91精品在线观看| 久久精品久久久久久国产 免费| 久久精品成人动漫| 欧美性猛交xxxx乱大交| 久久精品视频在线| 亚洲男女自偷自拍图片另类| 日韩欧美综合在线视频| 国产一区二区三区在线看| 国产美女久久精品香蕉69| 欧美在线中文字幕| 一区二区三区高清国产| 亚洲精品v天堂中文字幕| 亚洲精品xxx| 亚洲精品视频中文字幕| 91久久夜色精品国产网站| 91精品国产高清自在线| 国产精品美女呻吟| 69av成年福利视频| 欧美电影免费观看高清完整| 久久久精品视频在线观看| 亚洲人成在线观看网站高清| 国产精品91一区| 国产精品自产拍在线观看中文| 2019最新中文字幕| 国产精品第一区| 中文字幕国内精品| 日韩欧美在线字幕| 亚洲香蕉在线观看| 91精品国产综合久久香蕉的用户体验| 日韩欧美高清视频| 亚洲欧美日韩国产中文| 亚洲最大成人网色| 久久99国产精品久久久久久久久| 日韩av三级在线观看| 免费不卡在线观看av| 欧美多人爱爱视频网站| 精品日韩视频在线观看| 久久99久久99精品中文字幕| 92看片淫黄大片看国产片| 在线精品国产成人综合| 在线国产精品播放| 国产精品成人一区| 黑人巨大精品欧美一区二区|