返回

突破传统瓶颈:LeetCode 1122 数组的相对排序的 JavaScript 计数排序新思路

前端

问题概述

LeetCode 1122 数组的相对排序是一道经典的排序问题。给你两个整数数组 arr1arr2,其中 arr2arr1 的子集。你需要对 arr1 进行排序,使得 arr1 中每个元素的相对顺序都与 arr2 相同。换句话说,arr1 中的每个元素都应出现在 arr2 中其对应的元素之后。

例如,给定 arr1 = [2, 3, 1, 3, 2, 4, 6, 7, 9, 2, 19] 和 arr2 = [2, 1, 4, 3, 9, 6],你需要对 arr1 进行排序,使 arr1 变为 [2, 2, 2, 1, 4, 3, 3, 9, 6, 7, 19]。

计数排序简介

计数排序是一种非基于比较的排序算法,其核心思想在于利用元素的计数来确定其在排序后的位置。计数排序通常适用于元素值范围有限的场景,其时间复杂度为 ,空间复杂度为 。

JavaScript 计数排序实现

// JavaScript 计数排序函数
function countingSort(arr1, arr2) {
  // 确定计数数组的大小
  const maxValue = Math.max(...arr1, ...arr2);
  const counts = new Array(maxValue + 1).fill(0);

  // 计算每个元素的出现次数
  for (const num of arr1) {
    counts[num]++;
  }

  // 将计数数组转换为前缀和数组
  for (let i = 1; i <= maxValue; i++) {
    counts[i] += counts[i - 1];
  }

  // 根据前缀和数组构建结果数组
  const sortedArr = new Array(arr1.length);
  let index = arr1.length - 1;
  for (let i = arr1.length - 1; i >= 0; i--) {
    const num = arr1[i];
    sortedArr[counts[num] - 1] = num;
    counts[num]--;
  }

  return sortedArr;
}

// 示例输入
const arr1 = [2, 3, 1, 3, 2, 4, 6, 7, 9, 2, 19];
const arr2 = [2, 1, 4, 3, 9, 6];

// 调用计数排序函数并打印结果
console.log(countingSort(arr1, arr2));

性能分析

计数排序算法的性能优势主要体现在其时间复杂度和空间复杂度上。由于计数排序是一种非基于比较的排序算法,因此其时间复杂度不受元素数量的影响,始终为 ,这对于处理大量数据时具有明显的优势。另外,计数排序的空间复杂度也仅为 ,与输入数组的大小成正比,非常节省空间。

总结

JavaScript 计数排序解法为 LeetCode 1122 数组的相对排序问题提供了一种高效且实用的解决方案。其非凡的性能表现使其在处理大量数据时脱颖而出,特别适合元素值范围有限的场景。通过本文的深入剖析,我们不仅了解了计数排序算法的独特机制,也领略了其卓越的性能优势。希望这些知识能够帮助您在算法学习和应用中不断精进,突破传统瓶颈,创造新的辉煌。