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

相关推荐
晚安日记wanna4 分钟前
TS const 类型参数一道面试题的四层追问
前端·面试·typescript
用户921080262867 分钟前
前端 Vue 专栏 09:Vue Router 与前端路由
前端
無限進步D39 分钟前
Java Web 前端 简介
java·开发语言·前端·css·html·css3·web
码士集团小青43 分钟前
从落地到“半停用“:qiankun 微前端在一个 Vue 3 + Vite 项目中的完整实践与反思
前端
the局外人1 小时前
掌控自己的 K 线数据:TradingView 本地部署与数据源接入
前端·vue.js·websocket
deli0072 小时前
配色对比度检查器:一眼看清文字和背景谁看不清
前端
梦诺2 小时前
vue3 keepAlive+记录滚动条
前端·javascript·vue.js
葡萄城技术团队2 小时前
SpreadJS V19.2 新特性揭秘:甘特表的进度线
前端
计算机魔术师2 小时前
黄仁勋台上接特朗普电话开免提,全场听到一句话:AI 不会减速
前端
yivifu2 小时前
HTML元素的textContent和innerText两个属性的差别
前端·html