javascript几种常见排序算法

1. 冒泡排序 (Bubble Sort)

算法描述: 通过不断遍历列表并将相邻的元素进行比较和交换,使较大的元素逐渐"浮"到列表的末尾。重复这个过程直到整个列表排序完成。

ini 复制代码
function bubbleSort(arr) {
    let len = arr.length;
    for (let i = 0; i < len - 1; i++) {
        for (let j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
            }
        }
    }
    return arr;
}

// 示例使用:
const array = [5, 3, 8, 4, 2];
bubbleSort(array); // 输出:[2, 3, 4, 5, 8]

2. 选择排序 (Selection Sort)

算法描述: 在每一轮迭代中,找出剩余未排序部分中的最小(或最大)值,并将其与未排序部分的第一个元素交换位置。重复这个过程直到整个列表排序完成。

ini 复制代码
function selectionSort(arr) {
    let len = arr.length;
    for (let i = 0; i < len - 1; i++) {
        let minIndex = i;
        for (let j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex !== i) {
            [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
        }
    }
    return arr;
}

// 示例使用:
const array = [5, 3, 8, 4, 2];
selectionSort(array); // 输出:[2, 3, 4, 5, 8]

3. 插入排序 (Insertion Sort)

算法描述: 将数组视为多个有序子序列,每次从未排序部分取出一个元素,并将其插入到已排序部分的正确位置上,保持新插入元素后的子序列依然有序。

ini 复制代码
function insertionSort(arr) {
    for (let i = 1; i < arr.length; i++) {
        const 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;
}

// 示例使用:
const array = [5, 3, 8, 4, 2];
insertionSort(array); // 输出:[2, 3, 4, 5, 8]

4. 快速排序 (Quick Sort)

算法描述: 选择一个基准元素,将数组分为左右两个子数组,左边的元素都比基准小,右边的元素都比基准大,然后递归地对左右子数组进行快速排序。

ini 复制代码
function quickSort(arr, left = 0, right = arr.length - 1) {
    if (left < right) {
        const pivotIndex = partition(arr, left, right);
        quickSort(arr, left, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, right);
    }
    return arr;
}

function partition(arr, left, right) {
    const pivot = arr[right];
    let i = left - 1;
    for (let j = left; j < right; j++) {
        if (arr[j] <= pivot) {
            i++;
            [arr[i], arr[j]] = [arr[j], arr[i]];
        }
    }
    [arr[i + 1], arr[right]] = [arr[right], arr[i + 1]];
    return i + 1;
}

// 示例使用:
const array = [5, 3, 8, 4, 2];
quickSort(array); // 输出:[2, 3, 4, 5, 8]

5. 归并排序 (Merge Sort)

算法描述: 采用分治策略,将数组不断地分成两半,直到每个子数组只剩下一个元素,然后合并相邻的两个有序数组为一个更大的有序数组,最终得到完全排序的数组。

scss 复制代码
function mergeSort(arr) {
    if (arr.length < 2) return arr;

    const mid = Math.floor(arr.length / 2);
    const left = arr.slice(0, mid);
    const right = arr.slice(mid);

    return merge(mergeSort(left), mergeSort(right));
}

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());
        }
    }
    while (left.length) result.push(left.shift());
    while (right.length) result.push(right.shift());
    return result;
}

// 示例使用:
const array = [5, 3, 8, 4, 2];
mergeSort(array); // 输出:[2, 3, 4, 5, 8]

6. 堆排序 (Heap Sort)

算法描述: 首先构建一个最大堆或最小堆,然后反复将堆顶元素(最大或最小值)与堆尾元素交换,并调整堆结构,最后得到有序数组。

ini 复制代码
function heapify(arr, n, i) {
    let largest = i;
    let left = 2 * i + 1;
    let right = 2 * i + 2;

    if (left < n && arr[left] > arr[largest]) {
        largest = left;
    }

    if (right < n && arr[right] > arr[largest]) {
        largest = right;
    }

    if (largest !== i) {
        [arr[i], arr[largest]] = [arr[largest], arr[i]];
        heapify(arr, n, largest);
    }
}

function heapSort(arr) {
    let n = arr.length;

    // 构建最大堆
    for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }

    // 交换堆顶元素与末尾元素并缩小堆
    for (let i = n - 1; i > 0; i--) {
        [arr[0], arr[i]] = [arr[i], arr[0]];
        heapify(arr, i, 0);
    }

    return arr;
}

// 示例使用:
const array = [5, 3, 8, 4, 2];
heapSort(array); // 输出:[2, 3, 4, 5, 8]

以上仅为几种经典的排序算法,还有其他如希尔排序(Shell Sort)、计数排序(Counting Sort)、桶排序(Bucket Sort)、基数排序(Radix Sort)等多种算法。下次再发,毕竟今天周五了。跑路跑路!

相关推荐
会豪1 小时前
Electron-Vite (一)快速构建桌面应用
前端
中微子1 小时前
React 执行阶段与渲染机制详解(基于 React 18+ 官方文档)
前端
唐某人丶1 小时前
教你如何用 JS 实现 Agent 系统(2)—— 开发 ReAct 版本的“深度搜索”
前端·人工智能·aigc
中微子1 小时前
深入剖析 useState产生的 setState的完整执行流程
前端
遂心_2 小时前
JavaScript 函数参数传递机制:一道经典面试题解析
前端·javascript
小徐_23332 小时前
uni-app vue3 也能使用 Echarts?Wot Starter 是这样做的!
前端·uni-app·echarts
RoyLin2 小时前
TypeScript设计模式:适配器模式
前端·后端·node.js
遂心_2 小时前
深入理解 React Hook:useEffect 完全指南
前端·javascript·react.js
Moonbit3 小时前
MoonBit 正式加入 WebAssembly Component Model 官方文档 !
前端·后端·编程语言
龙在天3 小时前
ts中的函数重载
前端