M面经Prepare: Positive-Negative partitioning preserving order - neverlandly - 博客园
The basic idea of the algorithm is as follows:
1. We recursively 'sort' two smaller arrays of size n/2 (here 'sort' is defined in the question)
2. Then we spend \theta(n) time merging the two sorted smaller arrays with O(1) space complexity.
How to merge?
Suppose the two sorted smaller array is A and B. A1 denotes the negative part of A, and A2 denotes positive part of A. Similarly, B1 denotes the negative part of B, and B2 denotes positive part of B.
2.1. Compute the inverse of A2 (i.e., A2') in \theta(|A2|) time; compute the inverse of B1 (i.e., B1') in \theta(|B1|) time. [See observation; the total time is \theta(n) and space is O(1)]
Thus the array AB (i.e., A1A2B1B2) becomes A1A2'B1'B2.
2.2. Compute the inverse of A2'B1' (i.e., B1A2) in \theta(|A2|) time. [See observation; the total time is \theta(n) and space is O(1)]
Thus the array A1A2'B1'B2 becomes A1B1A2B2. We are done.
Time complexity analysis:
T(n) = 2T(n/2) + \theta(n) = O(nlogn)
https://www.geeksforgeeks.org/rearrange-positive-and-negative-numbers/
Read full article from M面经Prepare: Positive-Negative partitioning preserving order - neverlandly - 博客园
Given an array which has n integers,it has both positive and negative integers.
Now you need sort this array in a special way.After that,the negative integers should
in the front,and the positive integers should in the back.Also the relative position
should not be changed. eg. -1 1 3 -2 2 ans: -1 -2 1 3 2.
Time: O(NlogN), space: O(1)/O(logN) depends on iteration/recursion
This can be done in O(nlogn) using divide and conquer scheme. Before starting the algorithm, please see the following observation:
1. We recursively 'sort' two smaller arrays of size n/2 (here 'sort' is defined in the question)
2. Then we spend \theta(n) time merging the two sorted smaller arrays with O(1) space complexity.
How to merge?
Suppose the two sorted smaller array is A and B. A1 denotes the negative part of A, and A2 denotes positive part of A. Similarly, B1 denotes the negative part of B, and B2 denotes positive part of B.
2.1. Compute the inverse of A2 (i.e., A2') in \theta(|A2|) time; compute the inverse of B1 (i.e., B1') in \theta(|B1|) time. [See observation; the total time is \theta(n) and space is O(1)]
Thus the array AB (i.e., A1A2B1B2) becomes A1A2'B1'B2.
2.2. Compute the inverse of A2'B1' (i.e., B1A2) in \theta(|A2|) time. [See observation; the total time is \theta(n) and space is O(1)]
Thus the array A1A2'B1'B2 becomes A1B1A2B2. We are done.
Time complexity analysis:
T(n) = 2T(n/2) + \theta(n) = O(nlogn)
5 public void rearrange(int[] arr) { 6 if (arr==null || arr.length==0) return; 7 rearrange(arr, 0, arr.length-1); 8 } 9 10 public void rearrange(int[] arr, int l, int r) { 11 if (l == r) return; 12 int m = (l+r)/2; 13 rearrange(arr, l, m); 14 rearrange(arr, m+1, r); 15 merge(arr, l, m+1, r); 16 } 17 18 public void merge(int[] arr, int s1, int s2, int e) { 19 int findPos1 = s1, findPos2 = s2; 20 while (findPos1<s2 && arr[findPos1] < 0) findPos1++; 21 while (findPos2<=e && arr[findPos2] < 0) findPos2++; 22 reverse(arr, findPos1, s2-1); 23 reverse(arr, s2, findPos2-1); 24 reverse(arr, findPos1, findPos2-1); 25 } 26 27 public void reverse(int[] arr, int start, int end) { 28 while (start < end) { 29 int temp = arr[start]; 30 arr[start] = arr[end]; 31 arr[end] = temp; 32 start++; 33 end--; 34 } 35 }
https://www.geeksforgeeks.org/rearrange-positive-and-negative-numbers/
Approach 2: Optimized Merge Sort
Merge method of standard merge sort algorithm can be modified to solve this problem. While merging two sorted halves say left and right, we need to merge in such a way that negative part of left and right sub-array is copied first followed by positive part of left and right sub-array.
Merge method of standard merge sort algorithm can be modified to solve this problem. While merging two sorted halves say left and right, we need to merge in such a way that negative part of left and right sub-array is copied first followed by positive part of left and right sub-array.
Approach 1: Modified Insertion Sort
We can modify insertion sort to solve this problem.
Algorithm –
Loop from i = 1 to n - 1. a) If the current element is positive, do nothing. b) If the current element arr[i] is negative, we insert it into sequence arr[0..i-1] such that all positive elements in arr[0..i-1] are shifted one position to their right and arr[i] is inserted at index of first positive element.
Time complexity of above solution is O(n2) and auxiliary space is O(1).
A simple solution is to use another array. We copy all elements of original array to new array. We then traverse the new array and copy all negative and positive elements back in original array one by one. This approach is discussed here. The problem with this approach is that it uses auxiliary array and we’re not allowed to use any data structure to solve this problem.