思路:
时间复杂度:O(n) 其中 n 是给定数组中的元素数。因为我们使用循环遍历 N 次,因此它将花费我们 O(N) 时间
辅助空间:O(1),因为我们没有使用任何额外的空间。
- 两个变量 i 和 j 分别初始化为 -1 和 n。
- while 循环无限执行,直到它从循环内部返回。
- 在第一个内部 while 循环中,i 的值递增,直到遇到负元素。
- 在第二个内部 while 循环中,j 的值递减,直到遇到正元素。
- 如果 i 和 j 相互交叉,则所有元素的重新排列完成,函数返回。
- 如果 i 和 j 没有相互交叉,则交换正元素和负元素。
public class Alternate {
static void rearrange(int arr[], int n)
{
int i = -1, j = n;
while (true) {
// Move i to the next negative element
while (i < n - 1 && arr[++i] >= 0) {
}
// Move j to the next positive element
while (j > 0 && arr[--j] < 0) {
}
// If i and j cross, we have rearranged all
// elements
if (i >= j) {
return;
}
// Swap the positive and negative elements
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
static void printArray(int arr[], int n)
{
for (int i = 0; i < n; i++) {
System.out.print(arr[i] + " ");
if ((i + 1) % 3 == 0) {
System.out.println();
}
}
}
public static void main(String[] args)
{
int arr[] = { -1, 2, -3, 4, 5, 6, -7, 8, 9 };
int n = arr.length;
rearrange(arr, n);
System.out.println("Array after rearranging: ");
printArray(arr, n);
}
}