当前位置:首页 > JavaScript

js实现查找逆序数

2026-03-01 21:24:34JavaScript

逆序数概念

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

暴力法实现

直接遍历所有可能的元素对,统计满足逆序条件的对数:

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

时间复杂度为 O(n²),适合小规模数据。

归并排序优化法

利用归并排序过程统计逆序数,时间复杂度优化至 O(n log n):

js实现查找逆序数

function countInversions(arr) {
  let temp = new Array(arr.length);
  return mergeSort(arr, temp, 0, arr.length - 1);
}

function mergeSort(arr, temp, left, right) {
  let mid, invCount = 0;
  if (right > left) {
    mid = Math.floor((right + left) / 2);
    invCount += mergeSort(arr, temp, left, mid);
    invCount += mergeSort(arr, temp, mid + 1, right);
    invCount += merge(arr, temp, left, mid + 1, right);
  }
  return invCount;
}

function merge(arr, temp, left, mid, right) {
  let i = left, j = mid, k = left, invCount = 0;
  while (i <= mid - 1 && j <= right) {
    if (arr[i] <= arr[j]) {
      temp[k++] = arr[i++];
    } else {
      temp[k++] = arr[j++];
      invCount += (mid - i);
    }
  }
  while (i <= mid - 1) temp[k++] = arr[i++];
  while (j <= right) temp[k++] = arr[j++];
  for (i = left; i <= right; i++) arr[i] = temp[i];
  return invCount;
}

使用示例

const arr = [2, 4, 1, 3, 5];
console.log(countInversions(arr)); // 输出 3

注意事项

  • 暴力法简单但效率低,适用于教学演示或极小数据集。
  • 归并排序法虽然代码复杂,但在处理大规模数据时优势明显。
  • 若需要处理浮点数或特殊比较逻辑,需修改比较条件部分。

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

相关文章

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…