java - 如何根据数组的内容顺序有效地修改数组的内容?

标签 java arrays

我有一个关于数组的问题。例如,如果我知道数组的大小为 5,并且我的程序读取

[9993, 1000, 9992, 3, 872] 

进入数组,如何有效地编辑数组的内容,使其变为

[5, 3, 4, 1, 2]

我只能实现一个运行时间为 O(n^2) 的双 for 循环。我希望能找到更好的算法。

有什么提示吗?提前致谢!

最佳答案

一种选择是有一个像这样的类:

class Tuple implements Comparable<Tuple> {
    int value;  // value
    int pos;    // position in array

    public Tuple(int value, int pos) {
        this.value = value;
        this.pos = pos;
    }

    @Override
    public int compareTo(Tuple other) {  // sort based on values
        return Integer.compare(value, other.value);
    }
}

然后:

Tuple[] tups = new Tuple[array.length];

for (int i = 0; i < array.length; i++)
    tups[i] = new Tuple(array[i], i);

Arrays.sort(tups);

for (int i = 0; i < array.length; i++)
    array[i] = tups[i].pos + 1;

由于数组排序,这是一个 O(n log n) 的过程。

关于java - 如何根据数组的内容顺序有效地修改数组的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18935164/

相关文章:

ios - 使用 NSString 变量的名称创建可变数组

python - 删除 numpy 数组的一列

php - 在不允许时添加到数组的正确异常类型?

javascript - 通过过滤国家/地区属性对对象中的所有值求和 - javascript

java - 如何通过蓝牙向未指定的设备发送串行数据?

java - rmi 注册表绑定(bind)问题

java - 使用 `+` 或 `-` 运算符打印可以给出给定数字的所有组合

java - 如何设置只有秒和小数的倒计时器?

java - 本地 JDBC 连接成功,部署时相同代码失败

c - 如何使用 C 测量 L1、L2 和 L3 缓存延迟?