Reorder array according to given index

前端 未结 1 1679
名媛妹妹
名媛妹妹 2020-12-12 04:56

Algorithm reorder array according to given index

a[] = [50, 40, 70, 60, 90]
 index[] = [3,  0,  4,  1,  2]
a= [60,50,90,40,70] 

in O(n) and

相关标签:
1条回答
  • 2020-12-12 05:40

    You'll need space for a temp variable and loop counters / indices. The usual "reorder" according to algorithm is also going to change index[] back to {0, 1, 2, 3, 4}.

    Hint, noting the ordering of indices in index[].

              {0, 1, 2, 3, 4}
    index[] = {3, 0, 4, 1, 2}
    

    The reordering can be done by following the "cycles". Start with index[0], and note the "cycles" if you look at index[0], then index[index[0]], and so on ...

    // 1st cycle
    index[0] == 3   // cycle starts at 0
    index[3] == 1
    index[1] == 0   // end of cycle since back at 0
    
    // 2nd cycle
    index[2] == 4   // cycle starts at 2
    index[4] == 2   // end of cycle since back at 2
    

    Example C code:

    #include <stdio.h>
    
    static int A[] = {50, 40, 70, 60, 90};
    static int I[]  = {3,  0,  4,  1,  2};
    
    int main()
    {
    int i, j, k;
    int tA;
        /* reorder A according to I */
        /* every move puts an element into place */
        /* time complexity is O(n) */
        for(i = 0; i < sizeof(A)/sizeof(A[0]); i++){
            if(i != I[i]){
                tA = A[i];
                j = i;
                while(i != (k = I[j])){
                    A[j] = A[k];
                    I[j] = j;
                    j = k;
                }
                A[j] = tA;
                I[j] = j;
            }
        }
        for(i = 0; i < sizeof(A)/sizeof(A[0]); i++)
            printf("%d\n", A[i]);
        return 0;
    }
    

    The same algorithm, but using swaps instead of moves (this is slower method).

    #include <stdio.h>
    
    #define swap(a, b) {(a)^=(b); (b)^=(a); (a)^=(b);}
    
    static int A[] = {50, 40, 70, 60, 90};
    static int I[]  = {3,  0,  4,  1,  2};
    
    int main()
    {
    int i, j, k;
        /* reorder A according to I */
        /* every swap puts an element into place */
        /* last swap of a cycle puts both elements into place */
        /* time complexity is O(n) */
        for(i = 0; i < sizeof(A)/sizeof(A[0]); i++){
            if(i != I[i]){
                j = i;
                while(i != (k = I[j])){
                    swap(A[j], A[k]);
                    I[j] = j;
                    j = k;
                }
                I[j] = j;
            }
        }
        for(i = 0; i < sizeof(A)/sizeof(A[0]); i++)
            printf("%d\n", A[i]);
        return 0;
    }
    
    0 讨论(0)
提交回复
热议问题