首页 > 解决方案 > 数组排序和值同时变化

问题描述

我在下面有一个数组,每个数组中的第一个数字表示顺序。我想要做的是,每当我更改顺序时,它都会使用数组并将其重新索引为 2、3、4、5。

const payments = [
    [2, paymentName1, '5%'],
    [3, paymentName2, '5%'],
    [4, paymentName3, '5%'],
    [5, paymentName4, '5%']
  ];

例如,如果我将第一个数组顺序从 2 更改为 6,则数组变为下面的数组。

const payments = [
    [2, paymentName2, '5%'],
    [3, paymentName3, '5%'],
    [4, paymentName4, '5%'],
    [5, paymentName1, '5%'],
  ];

我目前所做的是对其进行排序并使用 for 循环对其进行重新排序。如果可能的话,我想在一个循环中完成。请帮我写这个算法。

提前致谢!

编辑:

payments.sort((a, b) => a[0] - b[0]);

for (const index in payments) {
  payments[index][0] = parseInt(index) + 2;
}

这是我目前的功能。会有更好的方法吗?谢谢!

标签: javascriptarraysalgorithmsortingindexing

解决方案


排序后,只需遍历数组并逐步分配新的订单值。这里没有“更好”。

const payments = [
    [2, "paymentName1", '5%'],
    [3, "paymentName2", '5%'],
    [4, "paymentName3", '5%'],
    [5, "paymentName4", '5%']
];

function setOrder(index, newOrder) {
    payments[index][0] = newOrder;
    payments.sort(([a], [b]) => a - b);
    for (let i = 0; i < payments.length; i++) payments[i][0] = i + 2;
}

setOrder(0, 6);
console.log(payments);

时间复杂度由调用决定sort:O(nlogn)。

或者,您可以使用二进制搜索来找到变异元素应该去的目标索引,然后相应地旋转数组元素。那么时间复杂度将是O(n)。尽管这具有更好的时间复杂度,但 JavaScript 代码的开销将使对于中等大小的数组,您将获得更快的结果sort


推荐阅读