js 排序動(dòng)畫模擬 冒泡排序
更新時(shí)間:2012年07月16日 00:27:54 作者:
在js中,想讓線程sleep一下確實(shí)不是一件簡單的事情,過多的使用定時(shí)器或者回調(diào)函數(shù),會(huì)讓復(fù)雜,凌亂,這時(shí),可以考慮能否使用隊(duì)列來做一些簡
而在某些場(chǎng)景中,隊(duì)列確實(shí)像一支奇兵,可以帶來不錯(cuò)的效果,比如配合定時(shí)器使用,可以模擬時(shí)間差效果
function createDq(){
var dq = [], size = 0;
return {
setDq:function(queue){
dq = queue;
size = queue.length;
},
queue:function(fn){
size ++;
dq.push(fn);
},
dqueue:function(){
size --;
return dq.shift();
},
run:function(fn){
var me = this, timer;
timer = setInterval(function(){
if(size <= 1){
clearInterval(timer);
}
fn.call(null,me.dqueue());
},30);
}
}
}
以上是一個(gè)簡單的實(shí)現(xiàn),在不同的場(chǎng)景,可以做一些適當(dāng)?shù)淖兺?,以做到因地制宜?
下面是一個(gè)模擬冒泡排序的動(dòng)畫,嘗試著使用了一點(diǎn)點(diǎn)觀察者模式,似乎還不錯(cuò)
function bubble(){
var obs = [];
function compare(x, y) {
return x.w - y.w;
}
function swap(a, i, j) {
var t = a[i]; a[i] = a[j]; a[j] = t;
}
function proxy(a, i, j){
notify(a[i].id + "-" + a[j].id);
swap.apply(null,arguments);
}
function notify(arg){
obs[0].m.call(obs[0],arg);
}
return {
addOb:function(ob){
obs.push(ob);
},
sort:function(arr){
var len = arr.length;
for (var x = 1; x < len; x++) {
for (var y = 0; y < len - x; y++) {
if (compare(arr[y], arr[y + 1]) > 0) {
proxy(arr, y, y + 1);
}
}
}
}
}
}
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
復(fù)制代碼 代碼如下:
function createDq(){
var dq = [], size = 0;
return {
setDq:function(queue){
dq = queue;
size = queue.length;
},
queue:function(fn){
size ++;
dq.push(fn);
},
dqueue:function(){
size --;
return dq.shift();
},
run:function(fn){
var me = this, timer;
timer = setInterval(function(){
if(size <= 1){
clearInterval(timer);
}
fn.call(null,me.dqueue());
},30);
}
}
}
以上是一個(gè)簡單的實(shí)現(xiàn),在不同的場(chǎng)景,可以做一些適當(dāng)?shù)淖兺?,以做到因地制宜?
下面是一個(gè)模擬冒泡排序的動(dòng)畫,嘗試著使用了一點(diǎn)點(diǎn)觀察者模式,似乎還不錯(cuò)
復(fù)制代碼 代碼如下:
function bubble(){
var obs = [];
function compare(x, y) {
return x.w - y.w;
}
function swap(a, i, j) {
var t = a[i]; a[i] = a[j]; a[j] = t;
}
function proxy(a, i, j){
notify(a[i].id + "-" + a[j].id);
swap.apply(null,arguments);
}
function notify(arg){
obs[0].m.call(obs[0],arg);
}
return {
addOb:function(ob){
obs.push(ob);
},
sort:function(arr){
var len = arr.length;
for (var x = 1; x < len; x++) {
for (var y = 0; y < len - x; y++) {
if (compare(arr[y], arr[y + 1]) > 0) {
proxy(arr, y, y + 1);
}
}
}
}
}
}
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
相關(guān)文章
微信小程序使用onreachBottom實(shí)現(xiàn)頁面觸底加載及分頁效果
小程序還沒有使用pc端的那種分頁格式,下面這篇文章主要給大家介紹了關(guān)于微信小程序使用onreachBottom實(shí)現(xiàn)頁面觸底加載及分頁效果的相關(guān)資料,需要的朋友可以參考下2022-10-10JS中將圖片base64轉(zhuǎn)file文件的兩種方式
這篇文章主要介紹了JS中圖片base64轉(zhuǎn)file文件的兩種方式,實(shí)現(xiàn)把圖片的base64編碼轉(zhuǎn)成file文件的功能,然后再上傳至服務(wù)器,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02Json字符串轉(zhuǎn)換為JS對(duì)象的高效方法實(shí)例
一般JSON字符串轉(zhuǎn)換為JS對(duì)象,都使用var jsonStr="{a:1}";var jsonObj = eval("("+jsonStr+")");2013-05-05Layer組件多個(gè)iframe彈出層打開與關(guān)閉及參數(shù)傳遞的方法
今天小編就為大家分享一篇Layer組件多個(gè)iframe彈出層打開與關(guān)閉及參數(shù)傳遞的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09JS實(shí)現(xiàn)點(diǎn)擊上移下移LI行數(shù)據(jù)的方法
這篇文章主要介紹了JS實(shí)現(xiàn)點(diǎn)擊上移下移LI行數(shù)據(jù)的方法,涉及javascript針對(duì)LI列表動(dòng)態(tài)排序的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08