用JavaScript实现排序算法

用JavaScript实现排序算法

冒泡排序,插入排序,快速排序,归并排序,桶排序,选择排序

1. 冒泡排序

1.1实现思路

每次比较相邻两个元素,如果前面的比后面大,就交换。

每一轮都会把最大的元素 "冒泡"到最后

第一轮结束,后面的依次类推

1.2 时间复杂度

情况 复杂度
最好(O) O(n)(加优化)
平均 O(n²)
最坏 O(n²)

1.3 是否稳定

稳定排序

1.4 JS代码

javascript 复制代码
function bubbleSort(arr) {
    let n = arr.length;

    for (let i = 0; i < n - 1; i++) {

        let swapped = false;

        for (let j = 0; j < n - 1 - i; j++) {

            if (arr[j] > arr[j + 1]) {
				// 解构赋值
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];

                swapped = true;
            }

        }

        if (!swapped) break;

    }

    return arr;
}

let arr = [5,2,9,1,3,6];
console.log(bubbleSort(arr));

2. 插入排序

2.1 实现思路

左边已经排好序。

拿右边一个元素,插入到左边合适位置。

例如

5 | 2 9 1 3

把2插进去

2 5 | 9 1 3

再拿9

2 5 9 | 1 3

拿1

1 2 5 9 | 3

直到结束。

2.2 时间复杂度

情况 复杂度
最好 O(n)
平均 O(n²)
最坏 O(n²)

2.3 是否稳定

稳定排序

2.4 JS代码

javascript 复制代码
function insertionSort(arr) {

    for (let i = 1; i < arr.length; i++) {

        let key = arr[i];
        let j = i - 1;

        while (j >= 0 && arr[j] > key) {

            arr[j + 1] = arr[j];
            j--;

        }

        arr[j + 1] = key;

    }

    return arr;
}

let arr = [5,2,9,1,3,6];
console.log(insertionSort(arr));

3. 选择排序

3.1 实现思路

每一轮:找最小值,放到当前位置。

例如

5 2 9 1 3

第一轮:找到最小值:1

和第一个元素交换

1 2 9 5 3

第二轮:剩余里面找最小2

不用交换

依次类推

3.2 时间复杂度

情况 复杂度
最好 O(n²)
平均 O(n²)
最坏 O(n²)

3.3 是否稳定

不稳定

交换最小元素时可能改变相同元素的相对位置。

3.4 JS代码

javascript 复制代码
function selectionSort(arr) {

    let n = arr.length;

    for (let i = 0; i < n - 1; i++) {

        let min = i;

        for (let j = i + 1; j < n; j++) {

            if (arr[j] < arr[min]) {
                min = j;
            }

        }

        [arr[i], arr[min]] = [arr[min], arr[i]];

    }

    return arr;
}

let arr = [5,2,9,1,3,6];
console.log(selectionSort(arr));

4. 快速排序

4.1 实现思路

快速排序采用分治思想

例一:

找一个基准值

例如:5 2 9 1 3 6

选:5

然后分成:

比5小:2 1 3

比5大:9 6

变成

2 1 3

5

9 6

左右继续递归。

最终

1 2 3 5 6 9

例二:

4.2 时间复杂度

情况 复杂度
最好 O(n log n)
平均 O(n log n)
最坏 O(n²)

4.3 是否稳定

不稳定

4.4 JS代码(递归)

javascript 复制代码
function quickSort(arr) {

    if (arr.length <= 1) {
        return arr;
    }

    let pivot = arr[0];

    let left = [];
    let right = [];

    for (let i = 1; i < arr.length; i++) {

        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }

    }

    return [...quickSort(left), pivot, ...quickSort(right)];
}

let arr = [5,2,9,1,3,6];
console.log(quickSort(arr));

5. 归并排序

5.1 实现思路

也是分治 一直拆

例如

5 2 9 1 3 6

拆成

5 2 9

1 3 6

继续拆

5

2

9

1

3

6

最后开始合并。

5 2

2 5
2 5

9

2 5 9

最终

1 2 3 5 6 9

5.2 时间复杂度

情况 复杂度
最好 O(n log n)
平均 O(n log n)
最坏 O(n log n)

5.3 是否稳定

稳定排序

5.4 JS代码

javascript 复制代码
function merge(left, right) {

    let result = [];

    while (left.length && right.length) {

        if (left[0] <= right[0]) {

            result.push(left.shift());

        } else {

            result.push(right.shift());

        }

    }

    return result.concat(left, right);

}

function mergeSort(arr) {

    if (arr.length <= 1) {
        return arr;
    }

    let mid = Math.floor(arr.length / 2);

    let left = mergeSort(arr.slice(0, mid));

    let right = mergeSort(arr.slice(mid));

    return merge(left, right);

}

let arr = [5,2,9,1,3,6];
console.log(mergeSort(arr));

6. 桶排序

6.1 实现思路

桶排序适用于数据分布较均匀的情况。

步骤:

  1. 建多个桶

0~9

10~19

20~29

...

例如

29 25 11 35 18

放桶

桶1:11 18
桶2:25 29
桶3:35

每个桶内部排序

最后依次输出

桶内排序算法的选择

6.2 时间复杂度

情况 复杂度
最好 O(n + k)
平均 O(n + k)
最坏 O(n²)

n:元素个数

k:桶的数量

6.3 是否稳定

若桶内使用稳定排序(如插入排序),则整体可以稳定。

6.4 JS代码

javascript 复制代码
function bucketSort(arr, bucketSize = 5) {

    if (arr.length === 0) return arr;

    let min = Math.min(...arr);
    let max = Math.max(...arr);

    let bucketCount = Math.floor((max - min) / bucketSize) + 1;

    let buckets = Array.from({ length: bucketCount }, () => []);

    // 放入桶中
    for (let num of arr) {
        let index = Math.floor((num - min) / bucketSize);
        buckets[index].push(num);
    }

    // 每个桶内使用插入排序
    function insertionSort(bucket) {
        for (let i = 1; i < bucket.length; i++) {
            let key = bucket[i];
            let j = i - 1;
            while (j >= 0 && bucket[j] > key) {
                bucket[j + 1] = bucket[j];
                j--;
            }
            bucket[j + 1] = key;
        }
        return bucket;
    }

    let result = [];

    for (let bucket of buckets) {
        insertionSort(bucket);
        result.push(...bucket);
    }

    return result;
}

let arr = [29,25,3,49,9,37,21,43];
console.log(bucketSort(arr));
相关推荐
槑有老呆1 小时前
从零搭建 LLM 流式对话前端:一文读懂 SSE、二进制流与 Vue 3 响应式
前端·javascript
张龙6871 小时前
前端错误监控生产级方案:从 onerror 捕获到 Source Map 精准还原
前端·javascript
渣波1 小时前
从零手写 Vite Mock 流式 AI 对话,搞懂 LLM 的“打字机”特效
前端·javascript
CHANG_THE_WORLD1 小时前
逐层拆解:C++ 虚函数从对象内存到手工调用的完整过程
java·开发语言·c++
Scott9999HH1 小时前
2026 避坑实录:国产品牌压力变送器什么牌子好?从硬件抗扰到 C++ Qt 实时曲线绘制源码剖析
开发语言·c++·qt
weedsfly1 小时前
从表单校验到订单流转,彻底搞懂前端开发中的策略模式与状态模式
前端·javascript·面试
geats人山人海2 小时前
c# 第八章 多态与案例
开发语言·c#
ch_atu2 小时前
使用python下载modelscope上的模型
开发语言·python
Albart5752 小时前
Python爬虫请求头伪装后仍被反爬,基于代理池+随机延迟的绕过实战
开发语言·爬虫·python