冒泡排序
  • 时间复杂度:

    • 最差情况:T(n)=O(n^2)
    • 最佳情况:T(n)=O(n)
    • 平均情况:T(n)=O(n^2)
  • 思路总结:两两对比,遇到不合符条件的立马换位置。
  • 代码展示:

    bubbleMinToMax(arr = []) {
        if (!utils.isArray(arr)) return [];
        let loopStart = 0, loopEnd = arr.length - 1;
        let lastChangeIndex = 0;
        while (loopStart < loopEnd) {
            // 正向循环找最大值
            for (let i = loopStart; i < loopEnd; i++) {
                if (arr[i] > arr[i + 1]) {
                    lastChangeIndex = i;
                    arr[i] ^= arr[i + 1];
                    arr[i + 1] ^= arr[i];
                    arr[i] ^= arr[i + 1];
                }
            }
            loopEnd = lastChangeIndex;
            // 反向循环找最小值
            for (let j = loopEnd; j > loopStart; j--) {
                if (arr[j - 1] > arr[j]) {
                    lastChangeIndex = j;
                    arr[j] ^= arr[j - 1];
                    arr[j - 1] ^= arr[j];
                    arr[j] ^= arr[j - 1];
                }
            }
            loopStart = lastChangeIndex;
        }
        return arr;
选择排序
  • 时间复杂度:

    • 最差情况:T(n)=O(n^2)
    • 最佳情况:T(n)=O(n^2)
    • 平均情况:T(n)=O(n^2)
  • 思路总结:两两对比,记录最小值/最大值下标,循环完一次后,再替换当前下标的值。
  • 代码展示:
selectionSort(arr = []) {
        if (!utils.isArray(arr)) return [];
        let minIndex;
        for (let i = 0; i < arr.length - 1; i++) {
            minIndex = i;
            for (let j = i + 1; j < arr.length; j++) {
                if (arr[minIndex] > arr[j]) {
                    minIndex = j;
                }
            }
            if (i === minIndex) continue;
            arr[i] ^= arr[minIndex];
            arr[minIndex] ^= arr[i];
            arr[i] ^= arr[minIndex];
        }
        return arr;
    }
插入排序
  • 时间复杂度:

    • 最差情况:T(n)=O(n^2)
    • 最佳情况:T(n)=O(n)
    • 平均情况:T(n)=O(n^2)
  • 思路总结:

    • 默认第一位为已被排好序的数据。
    • 取已被排好序的下一个元素(假设名为a),并用变量(假设名为insertData)记录a的值,将a的值与已被排好序的数据一一对比(从该位置往前)
    • 如果有已排序中的元素大于新元素(a)则将已排序的元素向后移动一位,反之则将a插入到该元素之后。
  • 代码展示:
// 查找插入位置使用二分查找法:二分查找法只适用于有序数据
    binaryInsertionSort(arr = []) {
        if (!utils.isArray(arr)) return [];
        for (let i = 1; i < arr.length; i++) {
            let key = arr[i], left = 0, right = i - 1;
            while (left <= right) {
                let middle = parseInt((left + right) / 2);
                if (arr[middle] >= key) {
                    right = middle - 1;
                } else {
                    left = middle + 1;
                }
            }
            for (let j = i - 1; j >= left; j--) {
                arr[j + 1] = arr[j];
            }
            arr[left] = key;
        }
        return arr;
    }

qzuser
31 声望4 粉丝