[英]Group together and Sort Odd and Even elements of the Array using Bubble sort
我正在尝试创建一个数组,其中奇数在数组左侧使用冒泡排序算法按顺序排序,偶数在数组右侧按顺序排序。
output 应该是这样的:
int[] a = {1,2,3,4,5,6,7,8,9,10}
output: 1 3 5 7 9 2 4 6 8 10
偶数和奇数之间的第一次拆分有效,奇数的排序也是如此,但偶数没有排序,我不知道为什么。
我的代码:
public class ObligOppgave4 {
public static void main(String[] args) {
int[] a = {1,2,3,4,5,6,7,8,9,10};
sortEvenAndOdd(a);
bubbleSortOdd(a);
bubbleSortEven(a);
print(a);
}
public static void sortEvenAndOdd(int[] a) {
int l = a.length;
int v = 0, h = l - 1;
if (a.length == 0) return;
while (v <= h) {
if (((a[v] % 2) == 0) && !((a[h] % 2) == 0)) {
change(a, v++, h--);
} else if ((a[v] % 2) == 0) {
h--;
} else if (!((a[h] % 2) == 0)) {
v++;
} else if (!((a[v] % 2) == 0) && ((a[h] % 2) == 0)) {
v++;
h--;
}
}
}
public static void bubbleSortOdd(int[] a) {
for (int n = 0; n < a.length; n++) {
for (int i = 1; i < n && a[i] % 2 != 0; i++) {
if (a[i - 1] > a[i]) {
change(a, i - 1, i);
}
}
}
}
public static void bubbleSortEven(int[] a){
for (int n = 0; n < a.length; n++) {
for (int i = 1; i < n && a[i] % 2 == 0; i++) {
if (a[i - 1] > a[i]) {
change(a, i ,i);
}
}
}
}
public static void change(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public static void print(int[] a) {
for(int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
}
在我看来,这是问题所在:
public static void bubbleSortEven(int[] a){
for (int n = 0; n < a.length; n++)
{
for (int i = 1; i < n && a[i] % 2 == 0; i++)
^^^^^^^^^^^^^^
由于您已经将奇数移动到数组的开头,因此 a[1] 几乎可以保证是奇数,因此您的循环将在它执行任何操作之前退出,因为 i=1,a[i]%2 是1.
您可能应该通过扫描数组以找到第一个偶数,然后从那里开始来开始sortEven
。
另一种选择是做一个单一的冒泡排序,你对均匀度的加权大于差异。 就像是:
int n1 = a[i-1];
int n2 = a[i];
if (n1%2 != n2%2) {
if (n1%2 == 0) {
// n1 is even and n2 is not. Swap them
change(a, i - 1, i);
}
} else if (n1 > n2) {
change(a, i - 1, i);
}
您可以通过对数组的奇数和偶数部分进行排序来解决此问题。 这将使解决方案更加简洁。
为此,我们可以获得pivot (索引将指向最右边的奇数或最左边的偶数),同时将数组分成两部分。
那么pivot索引可以在对数组进行排序时作为边界。
这就是它的实现方式:
public static void sortEvenAndOdd(int[] arr) {
int pivot = split(arr);
sort(arr, pivot);
}
public static int split(int[] arr) {
int odd = 0;
int even = arr.length - 1;
while (true) {
while (arr[odd] % 2 != 0 && odd < even) odd++;
while (arr[even] % 2 == 0 && odd < even) even--;
if (odd < even) swap(arr, odd, even);
else break;
}
return odd;
}
public static void sort(int[] arr, int pivot) {
int hiOdd = arr[pivot] % 2 != 0 ? pivot : pivot - 1; // if pivot points at the Even number - step one index back
for (int odd = 0, even = 0; odd <= hiOdd || arr.length - 1 - even > hiOdd; odd++, even++) {
for (int i = 0; i < hiOdd - odd; i++) {
if (arr[i] > arr[i + 1]) swap(arr, i, i + 1);
}
for (int j = arr.length - 1; j > hiOdd + even + 1; j--) {
if (arr[j - 1] > arr[j]) swap(arr, j, j - 1);
}
}
}
public static void swap(int[] arr, int odd, int even) {
int temp = arr[odd];
arr[odd] = arr[even];
arr[even] = temp;
}
main()
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7,8,9,10};
sortEvenAndOdd(array);
System.out.println(Arrays.toString(array));
}
Output:
[1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.