JavaScript中常见排序算法的实现代码
作者:shizhishi |
发布时间: |
分类:算法精解 |
声明:个人技术博客 • 非官方 • 仅供技术学习交流
**原理**:相邻元素两两比较交换,每轮将最大值"冒泡"到末尾,可提前终止无交换的遍历**时间复杂度**:O(n²)(平均情况)**稳定性**:稳定 function bubbleSort(arr) { let swapped; for (let i = 0; i arr[j + 1]) { [a...
### 一、冒泡排序(Bubble Sort)
**原理**:相邻元素两两比较交换,每轮将最大值"冒泡"到末尾,可提前终止无交换的遍历**时间复杂度**:O(n²)(平均情况)**稳定性**:稳定
```
function bubbleSort(arr) {
let swapped;
for (let i = 0; i arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; // 交换元素
swapped = true;
}
}
if (!swapped) break; // 无交换时提前终止
}
return arr;
}
```
### 二、快速排序(Quick Sort)
**原理**:分治法选取基准值,递归划分左右子数组**时间复杂度**:O(n log n)(平均情况)**稳定性**:不稳定
```
function quickSort(arr) {
if (arr.length pivot) right.push(num);
}
return [...quickSort(left), pivot, ...quickSort(right)];
}
```
### 三、插入排序(Insertion Sort)
**原理**:逐个将元素插入已排序序列的正确位置**时间复杂度**:O(n²)(平均情况)**稳定性**:稳定
```
function insertionSort(arr) {
for (let i = 1; i = 0 && arr[j] > key) {
arr[j + 1] = arr[j]; // 元素后移
j--;
}
arr[j + 1] = key; // 插入正确位置
}
return arr;
}
```
### 四、选择排序(Selection Sort)
**原理**:每次选择未排序部分的最小元素放入已排序末尾**时间复杂度**:O(n²)(恒为)**稳定性**:不稳定
```
function selectionSort(arr) {
for (let i = 0; i 0) {
for (let i = gap; i = gap && arr[j - gap] > temp) {
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
gap = Math.floor(gap / 2);
}
return arr;
}
```
### 七、计数排序(Counting Sort)
**原理**:统计元素频次反向填充数组**时间复杂度**:O(n + k)(k为数据范围)**适用场景**:整数且范围较小
```
function countingSort(arr) {
const max = Math.max(...arr);
const count = new Array(max + 1).fill(0);
for (const num of arr) count[num]++;
const result = [];
for (let i = 0; i
### 总结
* 小数据量:冒泡/插入/选择排序(代码简单)
* 大数据量:快速/归并排序(高效分治)
* 特殊场景:计数排序(整数小范围)、希尔排序(部分有序)