基于索引数组对整数数组进行排序?

时间:2013-02-26 05:25:25

标签: arrays algorithm

我们有两个数组作为输入

Array1:[7,12,11,4]

Array2:[1,3,2,0] - >这是索引数组(即Array1的位置,如果它被排序)。

现在我们需要使用索引数组Array2对Array1进行排序。

时间复杂度应为O(N)

空间复杂度可能大于O(1)但应小于O(N)

你不应该使用额外的数组,因为这会成为O(N)空间复杂度

3 个答案:

答案 0 :(得分:0)

考虑给出的数组是arr1和arr2。 按照array2排序的array1存储在'sortedArray'

下面给出的Java代码:

    int[] sortedArray = new int[arr1.length];
    for(int i=0;i<arr1.length;i++){
      int sourceIndex = arr2[i];
      sortedArray[i] = arr1[sourceIndex];
      }

时间复杂度和空间复杂度:O(n)

答案 1 :(得分:0)

似乎你想要的是下面的第二部分,你试图根据另一个数组对一个数组进行排序。否则,我不确定你为什么不直接对Array1进行排序。

一种方法是基于Array2对“索引”数组进行排序,然后使用它来索引到Array1。 Java示例:

Integer[] idx = new Integer[arr2.length];
for( int i = 0 ; i < idx.length; i++ ) idx[i] = i;              
Arrays.sort(idx, new Comparator<Integer>() {
    public int compare(Integer i1, Integer i2) {                        
        return arr2[i1].compareTo(arr2[i2]);
    }                   
});

// arr2[idx[i]] is the sorted value of arr2 at index i
// arr1[idx[i]] is the sorted value of arr1 corresponding to above at index i

(注意,您必须使用Integer而不是int,否则您不能使用自定义比较器。)

答案 2 :(得分:0)

基于在第二阵列中提供的具有IN PLACE的索引来排序或排列给定阵列,即O(1)空间和O(k * n)时间,其中k <1。 n,n =数组的长度

void swapElement(int arr1[], int arr2[], int i, int arrj){
    int temp = arr1[i];
    arr1[i] = arr1[arrj];
    arr1[arrj] = temp;

    temp = arr2[i];
    arr2[i] = arr2[arrj];
    arr2[arrj] = temp;
}

void  sortArray(int arr1[], int arr2[], int n){
    int i=0;
    for(;i<n;i++)
    {
        while(arr2[i]!=i){
            swapElement(arr1, arr2, i, arr2[i]);
        }
    }

}