当前位置:首页 > JavaScript

js实现查找逆序数

2026-04-04 22:13:22JavaScript

逆序数简介

逆序数指在一个序列中,前面的元素大于后面的元素的对数。例如序列 [2, 4, 1, 3, 5] 的逆序数为 3(即 (2,1), (4,1), (4,3))。

暴力法实现

直接遍历所有可能的元素对,统计逆序数。时间复杂度为 $O(n^2)$,适用于小规模数据。

function countInversions(arr) {
  let count = 0;
  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[i] > arr[j]) count++;
    }
  }
  return count;
}

// 示例
console.log(countInversions([2, 4, 1, 3, 5])); // 输出 3

归并排序优化法

利用归并排序的分治思想,在合并过程中统计逆序数。时间复杂度为 $O(n \log n)$,适合大规模数据。

js实现查找逆序数

function countInversions(arr) {
  return mergeSortAndCount(arr, 0, arr.length - 1);
}

function mergeSortAndCount(arr, left, right) {
  let count = 0;
  if (left < right) {
    const mid = Math.floor((left + right) / 2);
    count += mergeSortAndCount(arr, left, mid);
    count += mergeSortAndCount(arr, mid + 1, right);
    count += mergeAndCount(arr, left, mid, right);
  }
  return count;
}

function mergeAndCount(arr, left, mid, right) {
  const temp = [];
  let i = left, j = mid + 1, k = 0, count = 0;

  while (i <= mid && j <= right) {
    if (arr[i] <= arr[j]) {
      temp[k++] = arr[i++];
    } else {
      temp[k++] = arr[j++];
      count += (mid - i + 1); // 统计逆序数
    }
  }

  while (i <= mid) temp[k++] = arr[i++];
  while (j <= right) temp[k++] = arr[j++];
  for (let p = 0; p < k; p++) arr[left + p] = temp[p];

  return count;
}

// 示例
console.log(countInversions([2, 4, 1, 3, 5])); // 输出 3

注意事项

  • 暴力法简单直观,但性能较差。
  • 归并排序法效率更高,但实现稍复杂。
  • 若需处理浮点数或自定义比较逻辑,需调整比较条件(如将 arr[i] <= arr[j] 改为自定义函数)。

标签: 逆序js
分享给朋友:

相关文章

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现删除

js实现删除

使用 splice 方法删除数组元素 splice 方法可以删除数组中的元素,并返回被删除的元素。它接受两个参数:起始索引和要删除的元素数量。 const array = [1, 2, 3, 4…

js 实现全选

js 实现全选

实现全选功能的方法 使用 JavaScript 实现全选功能通常需要操作复选框(checkbox)的状态。以下是几种常见的实现方式。 通过 DOM 操作实现全选 // 获取全选复选框和子复选框 co…

js实现复制功能实现

js实现复制功能实现

使用document.execCommand方法(传统方式,已逐渐被弃用) 传统方式通过document.execCommand('copy')实现复制功能,需先选中文本。以下是一个完整示例: fu…

js和jquery

js和jquery

JavaScript 与 jQuery 的关系与区别 JavaScript 是一种动态编程语言,主要用于网页开发,使网页具有交互性。它是浏览器的原生脚本语言,可以直接在浏览器中运行。 jQuery…