冒泡排序(JS版)

冒泡排序的排序过程是简单直观的,主要的执行步骤:

1. 比较未排序序列中的相邻元素,如果两者的顺序不正确,则对两个元素进行交换;

2. 重复地对剩余未排序的元素执行上一步,直至完成排序;

 

具体代码实现细节:

1. 外层循环控制执行的轮数(如果有n个元素,一般会执行n-1轮);

2. 内层循环对未排序序列执行相邻元素的比较操作(后半部序列逐渐变得有序);

3. 可以做一些细节优化,提升一些执行性能。

 

执行过程的动态演示:

 

示例代码

/**
 * 冒泡排序(小优化方式1)
 */
var bubbleSort = function (nums) {
  const n = nums.length;
  // 控制执行轮数
  for (let i = 0; i < n - 1; i++) {
    // 当次的所有元素是否已经有序(未发生位置交换)
    let hasOrdered = true;
    // 比较相邻元素并交换
    for (let j = 0; j < n - 1 - i; j++) {
      if (nums[j] > nums[j + 1]) {
        swap(nums, j, j + 1);
        hasOrdered = false;
      }
    }
    if (hasOrdered) break;
  }
};

/**
 * 冒泡排序(小优化方式2)
 */
var bubbleSort = function(nums) {
  // 数据容量
  const n = nums.length;
  // 当前轮次的排序过程中,发生过元素的交换
  let hasSwapped = true;
  // 控制执行轮数
  for (let i = 0; i < n - 1; i++) {
    // 如果上一轮未发生位置的交换,则直接退出(已完成排序)
    if (!hasSwapped) break;
    // 初始化当前轮交换状态的值
    hasSwapped = false;
    // 比较相邻元素并交换
    for (let j = 0; j < n - 1 - i; j++) {
      if (nums[j] > nums[j + 1]) {
        swap(nums, j, j + 1);
        hasSwapped = true;
      }
    }
  }
};

/**
 * 交换两个位置上的元素
 */
var swap = function(nums, i, j) {
  const num = nums[i];
  nums[i] = nums[j];
  nums[j] = num;
};

 

 

(2021年9月左右的记录)冒泡排序的示例:

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

// 1. 利用中间变量
var swap = function(nums, i, j) {
    var t = nums[i];
    nums[i] = nums[j];
    nums[j] = t;
};

// 2. 利用加法(可能越界)
var swap = function(nums, i, j) {    
    nums[j] = nums[i] + nums[j];
    nums[i] = nums[j] - nums[i];
    nums[j] = nums[j] - nums[i];
};

 

 

End

posted @ 2021-08-15 18:46  樊顺  阅读(354)  评论(0编辑  收藏  举报