js 冒泡排序 选择排序 快速排序:js冒泡排序选择排序快速排序,3种算法对比与代码
JavaScript 排序算法对比:冒泡排序、选择排序与快速排序
排序算法是计算机科学中的基础算法之一,广泛应用于数据处理和优化问题中。在 JavaScript 中,常见的排序算法包括冒泡排序、选择排序和快速排序。这三种算法各有优缺点,适用于不同的场景。本文将对这三种算法进行详细对比,并提供相应的代码实现。
1. 冒泡排序
冒泡排序是一种简单的排序算法,通过重复遍历待排序的数组,比较相邻元素的值,如果它们的顺序错误就把它们交换过来。遍历数组的工作重复进行,直到没有再需要交换的元素,这意味着数组已经排序完成。
冒泡排序的特点:
- 简单易懂: 代码实现简单,容易理解。
- 时间复杂度: 平均和最坏情况时间复杂度为 O(n²),最好情况为 O(n)(当数组已经排序时)。
- 空间复杂度: O(1),因为它是原地排序算法。
- 稳定性: 稳定排序,相同元素的相对顺序不会改变。
冒泡排序的代码实现:
javascript
function bubbleSort(arr) {
let n = arr.length;
for (let i = 0; i < n - 1; i++) {
for (let j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 交换 arr[j] 和 arr[j + 1]
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
// 示例
const array = [64, 34, 25, 12, 22, 11, 90];
console.log("Original array:", array);
console.log("Sorted array:", bubbleSort(array));
2. 选择排序
选择排序是一种简单直观的排序算法。它的工作原理是:首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的特点:
- 简单易懂: 代码实现简单,容易理解。
- 时间复杂度: 平均和最坏情况时间复杂度为 O(n²),最好情况也是 O(n²)。
- 空间复杂度: O(1),因为它是原地排序算法。
- 稳定性: 不稳定排序,相同元素的相对顺序可能会改变。
选择排序的代码实现:
javascript
function selectionSort(arr) {
let n = arr.length;
for (let i = 0; i < n - 1; i++) {
let minIndex = i;
for (let j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex !== i) {
// 交换 arr[i] 和 arr[minIndex]
let temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
return arr;
}
// 示例
const array = [64, 34, 25, 12, 22, 11, 90];
console.log("Original array:", array);
console.log("Sorted array:", selectionSort(array));
3. 快速排序
快速排序是一种高效的排序算法,采用分治策略来对一个数组进行排序。快速排序的基本思想是:选择一个基准元素,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分的所有记录都比另一部分的所有记录小,然后分别对这两部分记录继续进行排序,以达到整个序列有序。
快速排序的特点:
- 高效性: 平均时间复杂度为 O(n log n),最坏情况为 O(n²)(当数组已经排序或逆序时)。
- 空间复杂度: O(log n),因为它是递归算法,需要额外的栈空间。
- 稳定性: 不稳定排序,相同元素的相对顺序可能会改变。
- 适用性: 适用于大数据量排序,效率高。
快速排序的代码实现:
javascript
function quickSort(arr) {
if (arr.length <= 1) {
return arr;
}
let pivot = arr[arr.length - 1];
let left = [];
let right = [];
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat(pivot, quickSort(right));
}
// 示例
const array = [64, 34, 25, 12, 22, 11, 90];
console.log("Original array:", array);
console.log("Sorted array:", quickSort(array));
对比
1. 时间复杂度:
- 冒泡排序和选择排序: 平均和最坏情况时间复杂度为 O(n²),适用于小数据量排序。
- 快速排序: 平均时间复杂度为 O(n log n),最坏情况为 O(n²),适用于大数据量排序。
2. 空间复杂度:
- 冒泡排序和选择排序: O(1),原地排序。
- 快速排序: O(log n),需要额外的栈空间。
3. 稳定性:
- 冒泡排序: 稳定排序。
- 选择排序: 不稳定排序。
- 快速排序: 不稳定排序。
4. 适用性:
- 冒泡排序: 适用于小数据量,简单易懂。
- 选择排序: 适用于小数据量,简单易懂。
- 快速
