用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));
相关推荐
OPEN-F6 小时前
C++进阶教程:继承与多态
开发语言·c++
泯泷7 小时前
手搓JSVMM第 8 篇:函数调用:参数、返回值与调用帧
前端·javascript·前端框架
Mr数据杨7 小时前
【Codex】用学生入学评估模块建立新生能力画像
android·java·javascript·django·codex·项目开发
luj_17688 小时前
大律师考核应重能力与科技素养
c语言·开发语言·c++·经验分享·算法
苏灿烤鱼9 小时前
没有机密文件,也没有付费数据,在浏览器里造一颗"间谍卫星"
前端·javascript·github
leonkay9 小时前
C# 特性(Attribute)——【1】基础讲解
开发语言·青少年编程·面试·c#·.net·个人开发
harmful_sheep9 小时前
java group by常见用法
java·开发语言·python
泯泷9 小时前
手搓JSVM第 5 篇:写第一个编译器:从 AST 生成 IR
前端·javascript·算法
SKH.9 小时前
Linux软件编程(6)线程间通信
java·开发语言·数据库
泯泷9 小时前
手搓JSVM第 7 篇:控制流:if、while 与 jump
前端·javascript·算法