Here is an algorithm which solves this problem in O(nlog^2 n):

Create a set of pairs B= {<ar [i],i >: i= 1..n}.
Sort B.
Now use the following Divide and Conquer algorithm (Ar_Low is a global array):
  Fill (Start, End, Low_Array)
    if Start= End then
      Low_Array [Start]= 0
    else
      Initialize Low_Array with zero.
      Fill (Start, (Start+ End)/ 2, Low_Array)
      Fill ((Start+ End)/ 2+ 1, End, Low_Array)
Scan B (the list of sorted pairs) and select the pairs whose second value is in range (End/ 2+ 1, End), call the resulting list B'

      For each i in (Start, (Start+ End)/ 2):
        Lets j be the position of arr [i] in B'
        Set Low_Array [i]= Low_Array [i]+ j

The running time of this algorithm is:
  n\log n for sorting B+
  T(n)= 2T(n/2)+ n\log n => T(n)= n\log^2 n

So, the total running time is: n\log^2 n .

Amir



On 07/26/2011 06:48 AM, Piyush Sinha wrote:
You have an array like ar[]= {1,3,2,4,5,4,2}. You need to create
another array ar_low[] such that ar_low[i] = number of elements lower
than or equal to ar[i] in ar[i+1:n-1].
So the output of above should be {0,2,1,2,2,1,0}

Time complexity : O(nlogn)
use of extra space allowed.



--
You received this message because you are subscribed to the Google Groups "Algorithm 
Geeks" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.

Reply via email to