我试图在一次通过时分别将偶数和奇数分别左右分开。此外,我想确保这些数字按照asc顺序排序,这样整个逻辑将具有O(n)的复杂性。
例如,如果我的输入是{9,8,2,3,11,10,1};
这个逻辑我实现了o / p为{10 8 2 3 11 9 1}但我想确保我的输出在同一个传递中被排序为{2,8,10,1,3,9,11}。
static void segregateEvenOdd(int arr[]) {
/* Initialize left and right indexes */
int left = 0, right = arr.length - 1;
while (left < right) {
/* Increment left index while we see 0 at left */
while (arr[left] % 2 == 0 && left < right)
left++;
/* Decrement right index while we see 1 at right */
while (arr[right] % 2 == 1 && left < right)
right--;
if (left < right) {
/* Swap arr[left] and arr[right] */
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
答案 0 :(得分:2)
使用允许您传递Comparator
的{{3}}。比较函数应该类似于下面(伪代码):
Comparison(a, b)
{
if (Even(a) && !Even(b))
return -1; // a < b
if (Even(b) && !Even(a))
return 1; // a > b
// both are even, or both are odd.
if (a < b) return -1;
if (a > b) return 1;
return 0;
}
答案 1 :(得分:0)
使用比较整数排序算法,最佳算法可以在O(nlgn)
中进行,因此您无法使用比较整数排序来实现O(n)
。
您可以做的是:您可以使用非比较整数排序算法。喜欢:
这将在O(n)
中对您的数组进行排序,并在输入中添加一些条件。
有关详细信息,请参阅一些示例
答案 2 :(得分:0)
一次通过是不可能的。你真的有两种不同的排序。一个用于偶数,一个用于赔率。
这是我的建议。
解决方案1。
如果允许引入新的数据结构,请采用以下方法 创建两个ArrayList(一个甚至一个用于奇数)将它们相应地分开。在两者上运行Collections.Sort。迭代地重新填充您的初始数组。
解决方案2.
使用上面的方法正确分隔均衡和赔率。计算列表中的平均数。构建一个典型的排序例程,如mergesort,并在数组的两个不同段上调用例程。以上示例将被称为
merge(arr, 0, 2);
merge(arr, 3, 6);
这两种解决方案都具有总体时间复杂度:O(nlogn)。空间复杂度:O(n)。解决方案一更容易实现,但解决方案二允许您进行更多就地排序。其他排序例程具有最佳情况O(n)时间但不保证它。
答案 3 :(得分:0)
我会使用快速排序或任何其他标准算法,但定义元素之间的比较为:a
小于b
如果a
为偶数且{{1} }是奇数,或者它们都是偶数或奇数b
。
这不会给你O(n),这是不可能的,但通过重复使用众所周知的算法将获得最大的性能。
答案 4 :(得分:0)
您还可以使用列表:
List<Integer> list = Arrays.asList(yourArray);
Collections.sort(list, new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return a%2 - b%2;
}
}