繁体   English   中英

使用冒泡排序将数组的奇数和偶数元素组合在一起并排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM