javascript排序算法动画演示效果的实现方法

在您知道之前,有人问您是如何编写冒泡排序算法的,如何使用HTML、CSS和Javascript来显示排序过程。

基本思想是用DOM结构在序列的每个步骤中表达每个数据的值。

问题1:如何逐步显示Javascript排序

我尝试过的一些想法:

1。让Javascript暂停并慢下来。

Javascript的排序是非常快的,如果我们可以看到它的实施过程中,我首先想到的是慢下来的排序。排序的每个周期使它停止300ms,然后继续。我怎么能阻止它吗看看Javascript看起来不象睡眠()的功能。暂停不能完成,但是你可以想办法使它和停顿一样有效。例如,在循环中做一些不相关的事情,例如。

首先,我们尝试让(true)始终执行一个空操作,然后返回排序逻辑一段时间,代码大致相同:


对于(var i = 0;i < 3;i + +){
Document.writeln(我); / / DOM操作
VAR现在=新的日期()GetTime();
而(新)日期(。时间)-(现在的< 3000){ }
}


慢是慢下来。然而,它太多的资源,和DOM不在分选过程中的变化,直到最终排序,DOM成为在排序的排序,但如果你设置断点,一步一步,你可以看到一步一步的变化。据估计,因为该操作太耗费资源,浏览器已经达到掌握DOM操作但已无法腾出资源用于DOM操作。所以当真正的DOM操作完成的js代码执行后。

那么让javascript排序慢慢来吧。

让Javascript暂停的另一种方式:

当你写这篇文章,你想一个办法阻止Javascript,Ajax请求同步,以及超时操作,放置一个Ajax请求在一个地方,你想停下来,同步的要求,并设置超时,加班的时间是我们必须暂停时间。服务器返回我们的Ajax请求,避免时间在超时之前请求到达时,您可以运行一个程序,如睡眠()在服务器端,这保证了Ajax不回。直接的时间,回到我们的环,但它只是一个想法。如果你有兴趣,你可以试试。

2。关闭定时器。这个想法不需要慢下来的排序过程。相反,使用数据包缓存关闭在该数组中的变化,然后使用setTimeout来确定显示数组的每个国家秩序。把下面的代码在这种环。


(函数(){())
var = arr.slice(thearr); / /电流阵列状态备份
setTimeout(){()函数(
bubblesortdom(thearr); / /排序操作DOM。
},500×时间计数);
时间计数+ +; / /定时器顺序。
});



然而,人们发现以这种方式编写的代码量会更大,而且在需要修改逻辑的区域中会有很大的变化,存在许多限制,例如,很难加快或减慢排序动画的操作。

三.缓存排序中数组的状态。

也就是说,在排序过程中,将数组的每个圆的状态保存到数组中。然后我们使用这个数组依次保存排序状态。


This.pushHis(arr.slice(),I-1,J,K,温度);


它只是需要一个setInterval(),可以加快和放慢动画非常方便。逻辑是很好理解的。

问题二:如何加快和减慢Javascript排序动画。

我们有第三种方法使用的问题。得到数组arr保留每一步的那种状态,那么我们可以使用setInterval()计时器显示一步一步的状态。如果你想加快速度或慢下来。在这样的情况下,()的定时执行间隔修改setInterval(),以前的计时器的位置被执行到阵列中,执行。

问题三:对于使用递归的数组,您如何处理不是如何对原始数组进行操作吗

使用递归的排序。它可能不是在数组上操作,而是返回到一个排序数组。那么我们如何在排序中获得数组的完整状态呢

例如,快速排序。

一开始,我不考虑动画,我就是这么做的。


功能快速排序(ARR){
VaR len = arr.length,leftarr = {},rightarr = {},标签;
如果(镜头< 2){
报酬;
}
标签= ARR { 0 };
对于(i = 1;i;;i;+;+){
如果(ARR {我} <=标签){
LeftArr.push(ARR {我})
其他{ }
RightArr.push(ARR {我});
}
}
返回快速排序(leftarr)。Concat(标签,快速排序(rightarr));
}


然后,为了考虑动画,我重写了它的逻辑,使其在同一阵列实现。事实上,在原数组当前阵的起源是在递归的时间。操作对原数组进行。

两种方法用于实现该方法,排序逻辑略有不同。

首先是随着距离的比较。当你遇到比自己,超越自己。回路编号+ 1.larger比目前排名子最后一面,循环序列号不变。直到安排完成。

这种方法的缺点是,即使是有序数组,也会被重新排列。

第二种方法是在标记位之外设置一个对比位。当你比你自己小的时候,把它放在前面,标记位,+ 1的位置,以及所有的标记位和对比位移到位置的后面。

满足比你更多。标记位是恒定的,位+ 1对比。

这种方法的缺点是数组上的操作太多,其优点是有序数组不会被重新排列。

方式1:


功能快速排序(ARR,A,B,qarr){

VaR len = arr.length,leftarr = {},rightarr = {},标签,I,K,len_l,len_r、LB、RA。
如果(a =未定义的b =未定义的){
= 0;乙= arr.length-1; / /初始化启动位置。
}
如果(qarr = = undefined){
qarr = arr.slice();
}

如果((len = = 2 = = ARR ARR { 0 } { 1 }){ | | Len<2)
报酬;
}

标签= qarr {一};
对于(i = 1;i <;){
如果(qarr { +我} <=标签){
LeftArr.push(qarr { +我});
qarr {一} = { + I-1 qarr +我};
qarr {一} +我=标签;
k +1;
++;
其他{ }
如果(leftarr。长度+ rightarr.length = = len-1){
打破;
}
温度qarr {一} +我=;
qarr {一} { b-rightarr +我= qarr长度};
qarr { b-rightarr长度} =温度;
RightArr.push(临时);
K = +·;
}
This.pushHis(qarr.slice(),A、B、K);
}

len_l = leftarr.length;
len_r = rightarr.length;
如果(len_l = = 0){
磅=;
其他{ }
LB = A + len_l - 1;
This.sort(leftarr,一磅,qarr);
}

如果(len_r = = 0){
类风湿性关节炎;
其他{ }
RA = B + 1 len_r;
This.sort(rightarr,RA,B,qarr)
}
返回qarr
}


模式二:


功能quicksort2(ARR,A,B,qarr){
VaR len = arr.length,leftarr = {},rightarr = {},标签,我,J,K,温度,len_l,len_r。
如果(a =未定义的b =未定义的){
= 0;乙= arr.length-1; / /初始化启动位置。
}
如果(qarr = = undefined){
qarr = arr.slice();
}
如果(镜头< 2){
报酬;
}
如果(len = = 2 = = ARR ARR { 0 } { 1 }){
报酬;
}
标签= qarr {一};
对于(i=1,k=0;i <;){
如果(qarr {一} > +我=标签){
RightArr.push(qarr { +我});
++;
其他{ }
温度qarr {一} +我=;
对于(j = i;j;+ K;j -){
qarr { } = { } qarr J-1 {J}.;
/ / this.pushhis(qarr。切片),一个(+ K、B);
}
qarr {一} =温度+ K;
LeftArr.push(临时);
钾+;
++;
}
This.pushHis(qarr.slice(),A,B,A + K,I-1);
}
len_l = leftarr.length;
len_r = rightarr.length;
如果(len_l = = 0){
磅=;
其他{ }
LB = A + len_l - 1;
This.sort(leftarr,一磅,qarr);
}
如果(len_r = = 0){
类风湿性关节炎;
其他{ }
RA = B + 1 len_r;
This.sort(rightarr,RA,B,qarr)
}
返回qarr;
}


下面会有动画演示的具体区别。

问题四:动画的流畅性。

排序动画的DOM操作非常快,我在这里做的优化只是让每个排序步骤只涉及一个DOM操作。

设计素描 uff1a


主要实现是:

冒泡排序javascript动画演示

插入排序javascript动画演示

选择排序Javascript动画演示

快速排序Javascript动画演示

合并排序javascript动画演示

希尔排序javascript动画演示

这是javascript排序算法动画演示效果的全部内容,你已经给你带来了。我希望你能支持得更多。