用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));
相关推荐
栀椩4 分钟前
Electron 内嵌页面跨域问题(CORS/PNA)解决全记录
前端·javascript·electron
SEO_juper13 分钟前
Chrome 扩展一键查看当前页面 SEO 信息:不用切页面,点一下全出来
前端·javascript·chrome
Highcharts.js15 分钟前
CSUN 2026|Highcharts无障碍数据与AI分享
javascript·人工智能·数据分析·highcharts·图表开发
熊猫钓鱼>_>20 分钟前
鸿蒙PC高分屏与键鼠交互适配:DPI缩放、右键菜单一次讲清
开发语言·笔记·华为·ai编程·harmonyos·鸿蒙·鸿蒙心迹
系统集成-鹰翔40 分钟前
ERP推单数据库怎么备份:SQLite WAL模式下只复制db文件为什么可能漏任务
javascript·数据库·经验分享·后端
octopus_c1 小时前
C++ 运算符重载详解 && 日期类的实现
开发语言·c++
Eiceblue1 小时前
用 Python 给 Word 文档加水印:文字、图片与批量处理
开发语言·vscode·python·word
j7~1 小时前
【C++ 面试笔记】(篇二):类与数据抽象 & STL 容器与算法
开发语言·c++·面试·stl容器和算法·类和数据抽象
Fuyo_11191 小时前
深入解析 C++ unordered_set 与 unordered_map 的核心特性与性能实战
开发语言·c++
小大宇2 小时前
Vue知识点-ElementPlus-05 输入框
前端·javascript·vue.js