【发布时间】:2021-05-14 16:11:06
【问题描述】:
所以我有这段代码,我在互联网上找到了一个包含负数和正数的数组并重新排列数组,因此所有负数都在正数之前。但是每个数字的出现位置必须保持不变。因此,例如,如果我有 -2 5 -9 .....,则在有组织的数组中,-2 仍然必须是 负数 的 first 数,而 -9 必须是second negative 个,5 必须是 positive 个的first 个数。
示例:
Input: {1,7,-5,9,-12,15,-6,-8}
Output:{-5,-12,-6,-8,1,7,9,15}
所以代码工作正常,但我想做的是改变它,使正数出现在负数之前。
示例:
Input: {1,7,-5,9,-12,15,-6,-8}
Output:{1,7,9,15,-5,-12,-6,-8}
这是代码,如果你能帮助我,我知道它不是很复杂,但我无法弄清楚。
// Java program to Rearrange positive and negative
// numbers in a array
public class Rearrangement {
/* Function to print an array */
static void printArray(int[] A, int size) {
for (int i = 0; i < size; i++)
System.out.print(A[i] + " ");
System.out.println("");
}
/* Function to reverse an array. An array can be
reversed in O(n) time and O(1) space. */
static void reverse(int[] arr, int l, int r) {
if (l < r) {
arr = swap(arr, l, r);
reverse(arr, ++l, --r);
}
}
// Merges two subarrays of arr[].
// First subarray is arr[l..m]
// Second subarray is arr[m+1..r]
static void merge(int[] arr, int l, int m, int r) {
int i = l; // Initial index of 1st subarray
int j = m + 1; // Initial index of IInd
while (i <= m && arr[i] < 0)
i++;
// arr[i..m] is positive
while (j <= r && arr[j] < 0)
j++;
// arr[j..r] is positive
// reverse positive part of
// left sub-array (arr[i..m])
reverse(arr, i, m);
// reverse negative part of
// right sub-array (arr[m+1..j-1])
reverse(arr, m + 1, j - 1);
// reverse arr[i..j-1]
reverse(arr, i, j - 1);
}
// Function to Rearrange positive and negative
// numbers in a array
static void RearrangePosNeg(int[] arr, int l, int r) {
if (l < r) {
// Same as (l+r)/2, but avoids overflow for
// large l and h
int m = (l + r) / 2;
// Sort first and second halves
RearrangePosNeg(arr, l, m);
RearrangePosNeg(arr, m + 1, r);
merge(arr, l, m, r);
}
}
static int[] swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
public static void main(String[] args) {
int[] arr = {1, 7, -5, 9, -12, 15, -6, -8};
int arr_size = arr.length;
RearrangePosNeg(arr, 0, arr_size - 1);
printArray(arr, arr_size);
}
}
【问题讨论】:
-
一种快速而肮脏的方法是运行代码,找到分区点并交换两组。
-
保留当前代码,但增加3个步骤:反转正子数组,反转负子数组,反转整个数组。
-
@Bohemian♦ 有没有办法将代码设计为将正数放在负数之前?我认为您所说的是保持精确的设计,但在此功能完成后交换两个子数组。我希望该函数以正确的方式对数组进行排序,而无需在函数完成后进行额外的更改。我不知道你是否明白我的意思。
-
我的猜测:将 while 循环条件从
< 0更改为>= 0(假设零被认为是正数) -
有时,更好的答案就是重新开始。这种排序可以使用
Arrays.sort和一个比较器来实现,该比较器将所有负数视为相等,所有正数视为相等,负数视为小于正数。请注意,您需要Integer[]而不是int[]。
标签: java arrays sorting recursion