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 ] |
在不考虑兼容性的前提下第三种是比较好的方法