Skip to main content

冒泡排序

冒泡排序(Bubble Sort)是一种简单直观的排序算法。它重复地走访过要排序的数列,依次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

算法步骤

  1. 比较两个相邻元素,若前者比后者大,则交换位置。每一轮结束,最后一个元素是最大的数。
  2. 对所有元素重复以上步骤,除了最后一个。
  3. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码实现

基本思想:每轮循环两两比较,得出一个最值。

function bubbleSort(nums) {
for (let i = 0; i < nums.length; i++) {
for (let j = 0; j < nums.length - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
swap(nums, j, j + 1);
}
}
}

return nums;
}

复杂度分析

空间复杂度:在整个排序的过程中,我们是直接在原数组内进行元素的两两交换,所以空间复杂度是 O(1)。

时间复杂度:如果给定的数组是有序的,我们只需要进行 n-1 次比较,时间复杂度是 O(n),这是最好的情况。如果给定的数组是逆序排列的,我们需要进行 n(n-1)/2 次比较,事件复杂度是 O(n^2),这是最坏的情况。如果给定的数组是乱序的,平均时间复杂度是 O(n^2)。由此可见,冒泡排序的时间复杂度是 O(n^2)。它是一种稳定的排序算法。

算法优化

冒泡排序总会执行 (N-1)+(N-2)+(N-3)+..+2+1 次,但如果运行到当中某一次时排序已经完成,或者输入的是一个有序数组,那么后边的比较就都是多余的。为了避免这种情况,我们增加一个变量,在每一轮循环后判断当前阶段是否发生过元素交换,如果没有则表示该数组已然有序排列,无需再进行循环。

function bubbleSort(nums) {
let hasChange;

for (let i = 0; i < nums.length; i++) {
for (let j = 0; j < nums.length - i - 1 && hasChange; j++) {
hasChange = false;
if (nums[j] > nums[j + 1]) {
swap(nums, j, j + 1);
hasChange = true;
}
}
}

return nums;
}