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

相关推荐
Stanford_11063 分钟前
关于IDE的相关知识之一【使用技巧】
前端·ide·windows·微信小程序·微信公众平台·twitter·微信开放平台
爱健身的小刘同学9 分钟前
安装 electron 依赖报错
前端·javascript·electron
耶啵奶膘9 分钟前
uniapp+vue2+uview2.0导航栏组件二次封装
前端·javascript·uni-app
布兰妮甜10 分钟前
如何使用 Tailwind CSS 构建响应式网站:详细指南
前端·css·tailwind css
MavenTalk11 分钟前
前端技术选型之uniapp
android·前端·flutter·ios·uni-app·前端开发
雨中奔跑的小孩14 分钟前
electron打包部署vue项目
javascript·vue.js·electron
ZZZCY200326 分钟前
路由策略与路由控制实验
前端·网络
shawya_void35 分钟前
javaweb-day01-html和css初识
前端·css·html
khatung36 分钟前
React——useReducer
前端·javascript·vscode·react.js·前端框架·1024程序员节
思考的橙子38 分钟前
CSS之3D转换
前端·css·3d