本文介绍了JavaScript中冒泡排序的三种实现方式:基础冒泡、双向冒泡及其改进版本。通过具体代码示例展示了数组排序过程,重点分析了双向冒泡在减少比较次数上的优化逻辑,并探讨了代码中存在的潜在变量定义问题及交换逻辑。
冒泡排序算法概述与可视化展示
本文展示了冒泡排序的可视化效果,包括基础冒泡排序、双向冒泡排序以及针对双向冒泡排序的轻微改进版本。
相关代码实现较为简洁,但可能存在未发现的潜在缺陷,欢迎专业开发者指正。
基础冒泡排序实现
以下是基础冒泡排序的具体示例代码。
var ls=[ 98,13,6,25,38,36,30,44,38,80,61,28,47,34,95,18,85,58,89,85,42,61,74,35,13,14,80,7,10,44,10,47,13,11,52,25,24,48,34,12,88,80,33,8,80,45,64,52,79,77 ];
for(var i=0;i<ls.length;i++){
for(var j=i+1;j<ls.length;j++){
if(ls[i]>ls[j]){
ls[i]=ls[i]+ls[j];
ls[j]=ls[i]-ls[j];
ls[i]=ls[i]-ls[j];
}
}
}
双向冒泡排序机制
接下来展示双向冒泡排序的实现示例。
var ls=[ 6,13,98,25,38,36,30,44,38,80,61,28,47,34,95,18,85,58,89,85,42,61,74,35,13,14,80,7,10,44,10,47,13,11,52,25,24,48,34,12,88,80,33,8,80,45,64,52,79,77 ];
for(var i=0;i<ls.length;i++){
for(var j=i+1;j<ls.length-i;j++){
if(ls[lent-1-i]<ls[lent-j]){
ls[lent-1-i]=ls[lent-1-i]+ls[lent-j];
ls[lent-j]=ls[lent-1-i]-ls[lent-j];
ls[lent-1-i]=ls[lent-1-i]-ls[lent-j];
}//后面的比较
if(ls[i]>ls[j]){
ls[i]=ls[i]+ls[j];
ls[j]=ls[i]-ls[j];
ls[i]=ls[i]-ls[j];
}//前面的比较
}
}
双向冒泡的改进策略
最后呈现的是对双向冒泡排序进行细微改进后的示例代码。
var ls=[ 98,13,6,25,38,36,30,44,38,80,61,28,47,34,95,18,85,58,89,85,42,61,74,35,13,14,80,7,10,44,10,47,13,11,52,25,24,48,34,12,88,80,33,8,80,45,64,52,79,77 ];
var lent=ls.length;
for(var i=0;i<ls.length;i++){
for(var j=i*2;j<ls.length-2*i;j++){
if(ls[i*2]>ls[j+1]){
ls[i*2]=ls[i*2]+ls[j+1];
ls[j+1]=ls[i*2]-ls[j+1];
ls[i*2]=ls[i*2]-ls[j+1];
}//保持内层第一个数为循环最小
if(ls[lent-i*2-1]<ls[lent-j-1]){
ls[lent-i*2-1]=ls[lent-i*2-1]+ls[lent-j-1];
ls[lent-j-1]=ls[lent-i*2-1]-ls[lent-j-1];
ls[lent-i*2-1]=ls[lent-i*2-1]-ls[lent-j-1];
}////保持内层倒数第一个数为循环最大
if(ls[lent-2-i*2]<ls[lent-j-1]){
ls[lent-2-i*2]=ls[lent-2-i*2]+ls[lent-j-1];
ls[lent-j-1]=ls[lent-2-i*2]-ls[lent-j-1];
ls[lent-2-i*2]=ls[lent-2-i*2]-ls[lent-j-1];
}//倒数上一个
if(ls[i*2+1]>ls[j+1]){
ls[i*2+1]=ls[i*2+1]+ls[j+1];
ls[j+1]=ls[i*2+1]-ls[j+1];
ls[i*2+1]=ls[i*2+1]-ls[j+1];
}//下一个
}
}