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;

}

五、