返回

手撕排序算法 | 庖丁解“序”,庖丁解“牛”

前端

排序算法是计算机科学的基础之一,在各种应用中扮演着重要角色。尤其在前端开发过程中,理解并掌握不同的排序算法不仅能够提高代码的执行效率,也能够在求职时给面试官留下深刻印象。

本文聚焦于十种常见的排序方法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序以及基数排序。通过深入分析每一种算法的工作原理,探讨其应用场景及优缺点,旨在帮助开发者在面试中精准应用。

冒泡排序

冒泡排序是最基本的排序方法之一,它重复地遍历列表,比较相邻元素,如果顺序错误则交换它们的位置,直到没有需要交换的情况为止。

代码示例:

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;
}

快速排序

快速排序是一种分而治之策略的排序算法。它通过选择一个“枢轴”元素将数组分为两部分,一部分小于枢轴,另一部分大于等于枢轴。

代码示例:

function quickSort(arr, left = 0, right = arr.length - 1) {
    if (left < right) {
        let pivotIndex = partition(arr, left, right);
        quickSort(arr, left, pivotIndex - 1); // 左半部分排序
        quickSort(arr, pivotIndex + 1, right); // 右半部分排序
    }
    return arr;

    function partition(arr, left, right) {
        let pivot = arr[right];
        let low = left;
        for (let i = left; i < right; i++) {
            if (arr[i] <= pivot) {
                [arr[i], arr[low]] = [arr[low], arr[i]];
                low++;
            }
        }
        // 将枢轴元素放到正确的位置
        [arr[right], arr[low]] = [arr[low], arr[right]];
        return low;
    }
}

归并排序

归并排序也是基于分治策略的算法。它将数组分成两半,递归地对每一半进行排序,最后合并两个已排序的部分。

代码示例:

function mergeSort(arr) {
    if (arr.length <= 1) return arr;
    const middle = Math.floor(arr.length / 2);
    const left = arr.slice(0, middle);
    const right = arr.slice(middle);

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

    function merge(left, right) {
        let resultArray = [], leftIndex = 0, rightIndex = 0;
        while (leftIndex < left.length && rightIndex < right.length) {
            if (left[leftIndex] < right[rightIndex]) {
                resultArray.push(left[leftIndex]);
                leftIndex++;
            } else {
                resultArray.push(right[rightIndex]);
                rightIndex++;
            }
        }

        return resultArray.concat(left.slice(leftIndex)).concat(right.slice(rightIndex));
    }
}

总结

以上只是排序算法的一小部分。每种算法都有其特定的应用场景和优缺点,开发者应根据实际需求选择合适的排序方法。

理解这些经典算法背后的原理,不仅能够帮助解决前端开发中的数据排序问题,也能够在面试中展示出扎实的计算机科学基础知识,从而在求职过程中获得竞争优势。

相关资源链接: