1.传统冒泡排序写法。(易于理解,引入了变量)

1
function bubbleSort_1(data) {
2
  for (let i = 0; i < data.length; i++) {
3
    for (let j = 0; j < data.length - i - 1; j++) {
4
      if (data[j] > data[j + 1]) {
5
        let tem = data[j];
6
        data[j] = data[j + 1];
7
        data[j + 1] = tem;
8
      }
9
    }
10
  }
11
}

2.异或运算(^)在两个二进制位不同时返回 1,相同时返回 0。(难以理解,未引入变量)
例:

1
let a = 1; // 二进制表示:01
2
let b = 3; // 二进制表示:11
3
a = a ^ b; // 01 ^ 11 (不同时返回1,相同时返回0)  返回二进制 10 即十进制 2  此时a =2
4
b = b ^ a; // 11 ^ 10 (不同时返回1,相同时返回0)  返回二进制 01 即十进制 1  此时b =1
5
a = a ^ b; // 10 ^ 01 (不同时返回1,相同时返回0)  返回二进制 11 即十进制 3  此时a =3

此时 a 和 b 的值已经交换过来了。连续对两个数 a 和 b 进行三次异或运算,a^ =b; b^ =a; a^ =b;,可以互换它们的值。利用此原理可以如下写

1
function bubbleSort_2(data) {
2
  for (let i = 0; i < data.length; i++) {
3
    for (let j = 0; j < data.length - i - 1; j++) {
4
      if (data[j] > data[j + 1]) {
5
        data[j] ^= data[j + 1];
6
        data[j + 1] ^= data[j];
7
        data[j] ^= data[j + 1];
8
      }
9
    }
10
  }
11
}

3.ES6 变量的解构赋值-交换变量的值。(易于理解,未引入变量)

1
function bubbleSort_3(data) {
2
  for (let i = 0; i < data.length; i++) {
3
    for (let j = 0; j < data.length - i - 1; j++) {
4
      if (data[j] > data[j + 1]) {
5
        [data[j], data[j + 1]] = [data[j + 1], data[j]];
6
      }
7
    }
8
  }
9
}
1
let arr = [9, 9, 9, 0, 2, 5, 6, 3, 7, 8, 9, 11];
2
bubbleSort_1(arr);
3
// bubbleSort_2(arr);
4
// bubbleSort_3(arr);
5
console.log(arr); // [ 0, 2, 3, 5, 6, 7, 8, 9, 9, 9, 9, 11 ]

在不考虑兼容性的前提下第三种是比较好的方法