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)等多种算法。下次再发,毕竟今天周五了。跑路跑路!

相关推荐
盛夏绽放6 小时前
jQuery 知识点复习总览
前端·javascript·jquery
胡gh8 小时前
依旧性能优化,如何在浅比较上做文章,memo 满天飞,谁在裸奔?
前端·react.js·面试
大怪v8 小时前
超赞👍!优秀前端佬的电子布洛芬技术网站!
前端·javascript·vue.js
胡gh8 小时前
你一般用哪些状态管理库?别担心,Zustand和Redux就能说个10分钟
前端·面试·node.js
项目題供诗8 小时前
React学习(十二)
javascript·学习·react.js
无羡仙9 小时前
Webpack 背后做了什么?
javascript·webpack
roamingcode10 小时前
Claude Code NPM 包发布命令
前端·npm·node.js·claude·自定义指令·claude code
码哥DFS10 小时前
NPM模块化总结
前端·javascript
灵感__idea10 小时前
JavaScript高级程序设计(第5版):代码整洁之道
前端·javascript·程序员
唐璜Taro10 小时前
electron进程间通信-IPC通信注册机制
前端·javascript·electron