Rearrange positive and negative numbers with constant extra space
Given an array of positive and negative numbers, arrange them such that all negative integers appear before all the positive integers in the array without using any additional data structure like a hash table, arrays, etc. The order of appearance should be maintained.
Examples:
Input: [12 11 -13 -5 6 -7 5 -3 -6]
Output: [-13 -5 -7 -3 -6 12 11 6 5]
A simple solution is to use another array. We copy all elements of the original array to a new array. We then traverse the new array and copy all negative and positive elements back into the original array one by one. This approach is discussed. The problem with this approach is that it uses an auxiliary array and we’re not allowed to use any data structure to solve this problem.
One approach that does not use any data structure is to use the partition process of QuickSort. The idea is to consider 0 as a pivot and divide the array around it. The problem with this approach is that it changes the relative order of elements. A similar partition process is discussed here.
Let’s now discuss a few methods which do not use any other data structure and also preserve the relative order of elements.
// Java program for
// moving negative numbers to left
// while maintaining the order
class
GFG {
static
int[] rotateSubArray(int[] arr, int
l, int
r) {
int
temp = arr[r];
for
(int
j = r; j > l - 1; j--) {
arr[j] = arr[j - 1];
}
arr[l] = temp;
return
arr;
}
static
int[] moveNegative(int[] arr) {
int
last_negative_index = -1;
for
(int
i = 0; i < arr.length; i++) {
if
(arr[i] < 0) {
last_negative_index += 1;
int
temp = arr[i];
arr[i] = arr[last_negative_index];
arr[last_negative_index] = temp;
// Done to manage order too
if
(i - last_negative_index >= 2)
rotateSubArray(arr, last_negative_index + 1, i);
}
}
return
arr;
}
// Driver Code
public
static
void
main(String args[]) {
int[] arr = { 5, 5, -3, 4, -8, 0, -7, 3, -9, -3, 9, -2, 1
};
arr = moveNegative(arr);
for
(int
i : arr) {
System.out.print(i + " ");
}
}
}
Output
-3 -8 -7 -9 -3 -2 5 5 4 0 3 9 1
Time Complexity: O(n2)
Auxiliary Space: O(1)