当前位置: 首页 > 面试题库 >

Java数组排序:获取数组索引排序列表的快速方法

芮星海
2023-03-14
问题内容

问题:考虑以下float []:

d[i] =     1.7 -0.3  2.1  0.5

我想要的是一个int []数组,它表示带有索引的原始数组的顺序。

s[i] =       1    3    0    2
d[s[i]] = -0.3  0.5  1.7  2.1

当然,可以使用自定义比较器,一组自定义对象集或通过简单地对数组进行排序,然后在原始数组中搜索索引(关闭)来完成。

我实际上正在寻找的是Matlab的sort函数的第二个return参数的等效项。

是否有一种简单的方法(<5 LOC)?可能有不需要为每个元素分配新对象的解决方案吗?

更新:

感谢您的回复。不幸的是,到目前为止,所提出的建议都不像我所希望的简单而有效的解决方案。因此,我在JDK反馈论坛中打开了一个线程,提议添加一个新的类库函数来解决该问题。让我们看看Sun
/ Oracle对这个问题的看法。

http://forums.java.net/jive/thread.jspa?threadID=62657&tstart=0


问题答案:

我将定制快速排序算法以同时在多个数组上执行交换操作:索引数组和值数组。例如(基于此quicksort):

public static void quicksort(float[] main, int[] index) {
    quicksort(main, index, 0, index.length - 1);
}

// quicksort a[left] to a[right]
public static void quicksort(float[] a, int[] index, int left, int right) {
    if (right <= left) return;
    int i = partition(a, index, left, right);
    quicksort(a, index, left, i-1);
    quicksort(a, index, i+1, right);
}

// partition a[left] to a[right], assumes left < right
private static int partition(float[] a, int[] index, 
int left, int right) {
    int i = left - 1;
    int j = right;
    while (true) {
        while (less(a[++i], a[right]))      // find item on left to swap
            ;                               // a[right] acts as sentinel
        while (less(a[right], a[--j]))      // find item on right to swap
            if (j == left) break;           // don't go out-of-bounds
        if (i >= j) break;                  // check if pointers cross
        exch(a, index, i, j);               // swap two elements into place
    }
    exch(a, index, i, right);               // swap with partition element
    return i;
}

// is x < y ?
private static boolean less(float x, float y) {
    return (x < y);
}

// exchange a[i] and a[j]
private static void exch(float[] a, int[] index, int i, int j) {
    float swap = a[i];
    a[i] = a[j];
    a[j] = swap;
    int b = index[i];
    index[i] = index[j];
    index[j] = b;
}


 类似资料:
  • 我有一个点列表,每个点都是一个大小为2的小列表。我想按x的递增顺序对点列表进行排序,如果x值相等,我就按y的递减顺序排序来打破平局。 我编写了一个自定义比较器来对点进行排序,如下所示: 以下是排序前的输入: 以下是使用上述比较器排序后产生的结果: 观察:- 输入按x的升序排序。 (5,12)被正确地放在(5,10)之前 (9,-15)被正确地放在(9,-1000)之前 然而,(10001,-10)

  • 在处理接近排序的数组时,哪种算法的快速排序或合并排序性能更好?为什么?我意识到,在这种情况下,其他算法可能会比这些算法表现得更好。

  • 问题内容: 我有以下课程。在此,虹膜是具有某些属性的另一类。 我想对此数组列表进行排序(即列表 helperList),基于距离参数降序。我已经编写了以下方法,但是它不起作用。 有人可以提出解决方案吗? 问题答案: 为什么不让您的类实现接口,然后使用Collections类提供的内置排序方法。 我认为这可以解决问题。另外,此方法是稳定的。 http://docs.oracle.com/javase

  • 问题内容: 我为无法快速找到答案感到困惑。我本质上是在寻找Java中的一种实现接口的数据结构,但该结构按顺序存储其成员。我知道您可以使用法线并在其上使用,但是我遇到的情况是,我偶尔会添加并经常从列表中检索成员,并且我不想每次检索成员时都对其进行排序,以防万一新增加了一个。谁能指出我在JDK甚至第3方库中都存在的这种东西? 编辑 :数据结构将需要保留重复项。 总结 :我发现所有这些都很有趣,并且学到

  • 问题内容: 我知道我们可以用 对数组进行排序。 但是如何获取数组的索引? 例如 我想得到输出:1、3、5、4、2 问题答案: 为此创建一个包装器,以记住索引并在交换值时交换它们: 游乐场:http : //play.golang.org/p/LnSLfe- fXk 。 编辑: 正如DaveC在评论中提到的那样,您实际上可以环绕以为任何可排序类型创建数据结构: