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

时间:2013-09-21 16:54:01

标签: java arrays

我有关于数组的问题。例如,如果我知道数组的大小将是5,并且我的程序读入

[9993, 1000, 9992, 3, 872] 

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

[5, 3, 4, 1, 2]

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

任何提示?提前谢谢!

2 个答案:

答案 0 :(得分:1)

一个选择就是拥有这样一个类:

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)过程,由于数组排序。

答案 1 :(得分:0)

为此,您必须使用一种排序算法,因此您可以获得的最佳运行时间是O(n logn)。如果您搜索它们,可以在线找到大量的排序算法。我建议为初学者学习的最快的是Quicksort,Mergesort和Heapsort。