1.传统冒泡排序写法。(易于理解,引入了变量)
function bubbleSort_1(data) {
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < data.length - i - 1; j++) {
if (data[j] > data[j + 1]) {
let tem = data[j];
data[j] = data[j + 1];
data[j + 1] = tem;
}
}
}
}
2.异或运算(^)在两个二进制位不同时返回1,相同时返回0。(难以理解,未引入变量)
例:
let a = 1; // 二进制表示:01
let b = 3; // 二进制表示:11
a = a ^ b; // 01 ^ 11 (不同时返回1,相同时返回0) 返回二进制 10 即十进制 2 此时a =2
b = b ^ a; // 11 ^ 10 (不同时返回1,相同时返回0) 返回二进制 01 即十进制 1 此时b =1
a = a ^ b; // 10 ^ 01 (不同时返回1,相同时返回0) 返回二进制 11 即十进制 3 此时a =3
此时a和b的值已经交换过来了。连续对两个数a和b进行三次异或运算,a^ =b; b^ =a; a^ =b;,可以互换它们的值。利用此原理可以如下写
function bubbleSort_2(data) {
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < data.length - i - 1; j++) {
if (data[j] > data[j + 1]) {
data[j] ^= data[j + 1];
data[j + 1] ^= data[j];
data[j] ^= data[j + 1];
}
}
}
}
3.ES6变量的解构赋值-交换变量的值。(易于理解,未引入变量)
function bubbleSort_3(data) {
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < data.length - i - 1; j++) {
if (data[j] > data[j + 1]) {
[data[j], data[j + 1]] = [data[j + 1], data[j]];
}
}
}
}
let arr = [9, 9, 9, 0, 2, 5, 6, 3, 7, 8, 9, 11];
bubbleSort_1(arr);
// bubbleSort_2(arr);
// bubbleSort_3(arr);
console.log(arr); // [ 0, 2, 3, 5, 6, 7, 8, 9, 9, 9, 9, 11 ]
在不考虑兼容性的前提下第三种是比较好的方法