JavaScript实现经典排序算法之冒泡排序
本文深入解析JavaScript中的冒泡排序算法,从基础原理出发,详细阐述其O(n^2)的时间复杂度特性。文章提供了三种不同阶段的代码实现:基础版本、基于position标志位的优化版本,以及双向扫描的鸡尾酒排序改进版。通过对比分析最佳、最差及平均情况下的性能表现,帮助开发者理解如何在实际场景中应用并优化排序逻辑。
冒泡排序概述
冒泡排序是计算机科学中极具代表性的排序算法之一。作为一种基于元素比较的排序方法,它的时间复杂度为O(n^2)。尽管在大规模数据面前效率有限,但其实现逻辑简单直观,因此在数据量n较小或教学演示场景中仍具有较好的性能表现。
算法原理与描述
1)算法原理 冒泡排序的核心思想是通过重复遍历待排序数列,依次比较相邻的两个元素。如果前一个元素大于后一个元素(针对升序排列),则交换它们的位置。经过一趟完整的遍历,最小的元素会被“冒泡”至序列的最前端;后续每一趟都遵循此规则,直至所有数据完成有序排列。
2)算法描述 <1>从头开始,依次比较相邻的两个元素。若前者大于后者,则执行交换操作; <2>对每一对相邻元素重复上述比较与交换过程,直至处理到最后一对元素。此时,序列末尾的元素应为当前未排序部分的最大值; <3>针对剩余未排序的所有元素,重复执行步骤<1>和<2>,但无需再处理已排序好的最后一个元素; <4>持续重复步骤<1>至<3>,直到整个序列完成排序。 3)javascript代码实现
基础代码实现
function bubbleSort(arr){
var len = arr.length;
for (var i = 0; i < len; i++) {
for(var j = 0; j < len - i -1; j++){
if(arr[j]>arr[j+1]){ //相邻元素进行对比
var temp = arr[j+1];//交换元素
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;//返回数组
}
var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52];//调用排序算法
console.log(bubbleSort(arr));//控制台输出结果
基于标志位的优化实现
上述代码展示了最基础的冒泡排序实现。为了提升效率,我们可以对该算法进行改进。主要思路是引入一个标志变量position,用于记录每一趟排序过程中最后一次发生元素交换的位置。由于position之后的元素在当趟排序后已经处于正确顺序,因此下一趟排序只需扫描至position处即可,从而减少不必要的比较次数。 改进后的算法逻辑如下:
优化版代码示例
function bubbleSort2(arr){
var i = arr.length -1;//开始时,扫描的最后位置
while(i>0){
var position = 0;//标志性变量,表示当前排序中交换的位置
for(var j = 0; j < i; j ++){
if(arr[j]>arr[j+1]){
position = j;
var temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
i = position;
}
return arr;
}
var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52];
console.log(bubbleSort2(arr));
双向扫描改进算法
传统冒泡排序每趟仅能确定一个最大值或最小值。为了进一步减少排序趟数,我们可以采用双向扫描策略:在每趟排序中,既进行正向冒泡以确定最大值,又进行反向冒泡以确定最小值。这样一次遍历即可确定两个最终值(最大者和最小者),从而使总的排序趟数几乎减半。 这种双向冒泡(鸡尾酒排序)的改进算法代码如下:
双向冒泡代码示例
function bubbleSort3(arr){
var low = 0;
var high = arr.length-1;
var temp;
while(low < high){//找到最大值
for(var j = low ; j < high ; j++){
if (arr[j]> arr[j+1]) {
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
--high;//修改high值,向前移一位
}
while(low > high){//找到最小值
for(var j = high ;j > low; j--){
if (arr[j]> arr[j+1]) {
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
++low;//修改low值,往后移动一位
}
return arr;
}
var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52];
console.log(bubbleSort3(arr));
算法性能分析
4)算法分析
最佳情况:T(n) = O(n) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2)
以上内容涵盖了冒泡排序的核心原理、基础实现及两种优化策略。希望这些内容能为您的学习提供有益参考,也欢迎大家继续支持本站获取更多技术分享。
JavaScript闭包与类(Class)的区别及适用场景对比
2026-11-05 15:48:57
JavaScript入门要学ES6吗?let与箭头函数等新特性解析
2026-11-05 14:49:16
JavaScript 8种数据类型详解:基本类型与引用类型的区别
2026-11-05 14:25:15
怎么在JavaScript中使用async/await优化Ajax异步流程
2026-11-05 13:56:15
JavaScript replace回调函数实现动态正则替换逻辑
2026-11-05 13:52:13
相关标签:
