js冒泡排序原理秒懂,5分钟学会底层逻辑
Js冒泡排序原理秒懂,5分钟学会底层逻辑
冒泡排序,作为排序算法中的“老牌选手”,虽然效率并不出众,但其简洁的原理和易于理解的实现方式,使其成为学习排序算法的绝佳起点。今天,我们就用5分钟的时间,深入探究Js中冒泡排序的底层逻辑,让你真正“秒懂”这一经典算法。
一、冒泡排序的基本思想
冒泡排序的核心思想非常简单:通过多次遍历待排序的数组,依次比较相邻的两个元素,若发现它们的顺序错误(即前者大于后者),则交换它们的位置。 经过一轮这样的遍历,数组中最大的元素就会被“冒泡”到最末尾的位置。重复进行这个过程,直到数组完全有序。
二、Js冒泡排序的实现步骤
下面,我们用Js代码的形式,一步步实现冒泡排序:
javascript
function bubbleSort(arr) {
// 获取数组长度
let n = arr.length;
// 外层循环控制遍历的轮数,共需要n-1轮
for (let i = 0; i < n - 1; i++) {
// 内层循环进行相邻元素的比较和交换
for (let j = 0; j < n - 1 - i; j++) {
// 比较相邻元素arr[j]和arr[j+1]
if (arr[j] > arr[j + 1]) {
// 若顺序错误,则交换它们的位置
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
// 返回排序后的数组
return arr;
}
三、深入理解代码细节
让我们深入分析代码的每一部分:
外层循环(`for (let i = 0; i < n - 1; i++)`): 这一层循环控制着排序的轮数。每一轮循环都会将当前未排序部分的最大元素“冒泡”到其正确的位置。由于每轮循环都会将最大元素放置在末尾,因此总共需要n-1轮才能完成整个数组的排序。
内层循环(`for (let j = 0; j < n - 1 - i; j++)`): 这一层循环负责进行相邻元素的比较和交换。随着外层循环的进行,已排序部分的元素会逐渐向数组末尾移动,因此内层循环的次数需要逐渐减少,避免对已排序部分进行不必要的比较。`n - 1 - i` 确保了每次循环都比较到当前未排序部分的最后一位。
比较和交换(`if (arr[j] > arr[j + 1])`): 这是冒泡排序的核心操作。如果发现相邻元素arr[j]和arr[j+1]的顺序错误(即arr[j]大于arr[j+1]),则交换它们的位置。通过不断进行这样的比较和交换,最终实现数组的排序。
四、优化冒泡排序
虽然冒泡排序的原理简单,但其时间复杂度为O(n^2),在处理大量数据时效率较低。为了优化冒泡排序,我们可以引入一个标志变量,用于判断每一轮循环是否发生了交换。如果在某一轮循环中没有发生任何交换,说明数组已经有序,可以提前终止排序,从而提高算法的效率。
javascript
function bubbleSortOptimized(arr) {
let n = arr.length;
let swapped;
for (let i = 0; i < n - 1; i++) {
swapped = false;
for (let j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
// 如果这一轮没有发生交换,说明数组已经有序
if (!swapped) {
break;
}
}
return arr;
}
五、
