每天做个总结吧,坚持就是胜利!
/**
@date 2021-06-18
@description 冒泡排序有没有可优化的地方?
*/
壹(序)
冒泡排序是一个很经典的排序方法,也是最基础的排序算法之一,今天学习一下冒泡排序可优化的点。
贰(冒泡排序)
冒泡排序主要步骤如下:
-
比较相邻的两个元素,如果前面的元素比较大则交互位置;
-
对每一对相邻的元素做以上操作,最后会将最大的元素放置在尾部;
-
对所有元素重复以上操作,除了已经排序好的尾部;
-
直到比较完成。
代码实现如下:
const bubble = (arr) => {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
};
const arr = [2, 4, 6, 1, 52, 72, 78, 1, 31, 3];
console.log(bubble(arr)); // [1, 1, 2, 3, 4, 6, 31, 52, 72, 78]
叁(优化-鸡尾酒排序)
鸡尾酒排序是冒泡排序的变形,不同之处在于鸡尾酒排序是从低到高再从高到低,是双向的冒泡排序,而冒泡排序只是单向的从低到高;所以鸡尾酒排序会有稍微好一点的性能。但是在随机数序列的情况下,两者性能上的差别其实并不大。
代码实现:
const cocktailSort = (arr) => {
let left = 0,
right = arr.length - 1;
while (left < right) {
for (let i = left; i < right; i++) {
if (arr[i] > arr[i + 1]) {
[arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
}
}
right--;
for (let i = right; i > left; i--) {
if (arr[i] < arr[i - 1]) {
[arr[i], arr[i - 1]] = [arr[i - 1], arr[i]];
}
}
left++;
}
return arr
};
const arr = [2, 4, 6, 1, 52, 72, 78, 1, 31, 3];
console.log(cocktailSort(arr)); // [1, 1, 2, 3, 4, 6, 31, 52, 72, 78]