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代码执行结束之后。
(function(){var theArr = arr.slice();//当前数组状态的备份setTimeout(function(){bubbleSortDom(theArr);//排序的DOM操作。},500*timeCount);timeCount++;//定时器的顺序。})();不过后来发现这样子写的话代码量会比较大,逻辑有修改的话要修改的地方会有点多。局限性很多,比如要实现排序动画加快或减慢操作几乎是很困难的。所以还要另想办法。
this.pushHis(arr.slice(),i-1,j,k,temp);这样就只需要一个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));}然后为了考虑动画,我改写了它的逻辑,让它在同一个数组上进行了实现。 其实是在递归的时候传入了当前的的子数组在原数组中的起始位置。从而在原数组上进行了操作。
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; }具体的不同下面会有动画演示。
主要实现了:
冒泡排序JavaScript动画演示
插入排序JavaScript动画演示
选择排序JavaScript动画演示
快速排序JavaScript动画演示
归并排序JavaScript动画演示
希尔排序JavaScript动画演示
以上就是小编为大家带来的JavaScript排序算法动画演示效果的实现方法全部内容了,希望大家多多支持脚本之家~