开发者

Programming interview question (array inversion) [duplicate]

This question already has answers here: Closed 11 years ago.

Possible Duplicate:

Counting inversions in an array

This is a programming question that I had when I was interviewed by a company for a developer job few months ago.

Given an array A of N integers, an inversion of the array is defined as any pair of indexes (a,b) such that a<b and A[b]<A[a].

Write a function:

int inversion_count(int A[], int n);

which computes the number of inversions in A, or returns -1 if such number exceeds 1,000,000,000. For example, in the following array

A[0]=-1 A[1]=6 A[2]=3 A[3]=4 A[4]=7 A[5]=4

there are four inversions:

(1,2)  (1,3)  (1,5)  (4,5)

so the function should return 4.

I solved this question in a very common way: using double loop.

int i, j;
long count;
for (i = 0; i < n; i++) {
   for (j = i+1; j < n; j++) {
      if (A[i] > A [j]) count++;
      if (count > 100000000开发者_JAVA技巧0) break; // exit loop
   }
   if (count > 1000000000) break; // exit loop
}
if (count > 1000000000) return -1;
else return count;

So the running time of it is : O (nsquare), and I was told that it was not efficient. I am now thinking of a different way to solve this problem, maybe using an n log n algorithm, but I haven't figured it out yet. Any ideas?


This answer explains a O(n log n) algorithm: Counting inversions in an array.

The trick is to first sort (O(n log n)), and then use binary search to find elements (also O(n log n)) resulting in O(n log n).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜