Tuesday 17 March 2015

Nagarro :Resort the array taking absolute value of negative numbers

Question: You are given a sorted array containing both negative and positive values. Resort the array taking absolute value of negative numbers. Your complexity should be O(n)
 Ex. A = {-8,-5,-3,-1,3,6,9} Expected Output: {-1,-3,3,-5,6,-8,9}


package nagarro;

public class SortAbsolute {
 public static void main(String[] args) {
  int array[] = { -8, -5, -3, -1, 3, 6, -9 };

  printnlogn(array);// complexity O(nlogn) uses insertion sort
  printn(array);// complexity O(n) uses counting sort

 }

 static public void printn(int arr[]) {
  int max = 0;// absolute max
  int b[] = new int[arr.length];
  for (int a : arr) {
   if (max * max < a * a)
    max = a;
  }
  if (max <= 0)
   max = -max;
  // System.out.println("max " + max);

  int c[] = new int[max + 1];
  for (int a : arr) {
   if (a >= 0)
    c[a] = c[a] + 1;
   else
    c[-a] = c[-a] + 1;
  }
  // step 1 over
  /*for (int i : c)
   System.out.print(i + ",");
  System.out.println(" --");*/
  for (int i = 1; i < max + 1; i++)
   c[i] = c[i - 1] + c[i];
  // step 2 over
  /*for (int i : c)
   System.out.print(i + ",");
  System.out.println(" --");*/

  for (int i = arr.length - 1; i >= 0; i--) {
   if (arr[i] >= 0) {
    b[c[arr[i]] - 1] = arr[i];
    c[arr[i]]--;
   } else {

    b[c[-arr[i]] - 1] = arr[i];
    c[-arr[i]]--;
   }

  }

  for (int i : b)
   System.out.print(i + ",");
  System.out.println("-- complexity O(n)");

 }

 static public void printnlogn(int arr[]) {
  int j = 0;
  int temp;
  for (int i = 1; i < arr.length; i++) {
   j = i - 1;
   temp = arr[i];
   while (j >= 0 && compare(arr[j], temp)) {
    arr[j + 1] = arr[j];
    arr[j] = temp;
    j--;
   }

  }

  for (int a : arr)
   System.out.print(a+",");
  System.out.println("-- complexity O(nlogn)");
 }

 static public boolean compare(int a, int b) {
  a *= a;
  b *= b;
  if (a > b)
   return true;
  return false;
 }

}
OUTPUT
-1,-3,3,-5,6,-8,-9,-- complexity O(nlogn)
-1,-3,3,-5,6,-8,-9,-- complexity O(n)