繁体   English   中英

排序数组的偶数和奇数部分

[英]Sort even and odd part of array

我有点坚持这种逻辑。 让我说我有和int数组。 我需要的是分开偶数和奇数,即所有偶数应该按排序顺序排在第一位,然后按排序顺序排列所有奇数。
这需要仅使用数组而不是集合。
输入将是。

int[] a ={3,2,5,6,4,9,11,7}

输出应为

{2,4,6,3,5,7,9,11}

我的方法是: -
1.首先分开偶数和奇数。
2.然后找到last_index-of_even_number。
3.然后先对数组进行排序0-last_index-of_even_number ,然后对last_index-of_even_number- arr.length

但我认为这不是一个好方法。 任何人都可以通过算法和代码示例帮助我理解这个逻辑。

应用任何排序算法并将比较器用作比偶数“小于”奇数的偶数。 这使您可以使用良好的排序算法,同时仍按您希望的方式对元素进行排序。

这是我的gnome排序实现和我的比较功能:

private static void sort(int[] arr) {
    int index = 0;
    int n = arr.length;
    while (index < n) {
        if (index == 0)
            index++;
        if (compare(arr[index], arr[index - 1]))
            index++;
        else {
            int temp = arr[index];
            arr[index] = arr[index - 1];
            arr[index - 1] = temp;
            index--;
        }
    }
}

private static boolean compare(int a, int b) {
    if (a % 2 == b % 2) return a > b;
    return a % 2 == 1;
}

public static void main(String[] args) {
    int[] a = {3, 2, 5, 6, 4, 9, 11, 7};

    sort(a);

    for (int i : a) {
        System.out.print(i + " ");
    }
}

工作正常。 尝试其他排序算法。

TL; DR:不使用“<”和“>”比较项目,而是使用函数。

简单解决方案

  1. 对输入数组进行排序。
  2. 创建一个具体的List 使用您想要的任何实现; LinkedList似乎适合。
  3. 一次运行输入数组。 对于每个偶数,将其添加到List
  4. 再次运行输入数组。 对于每个添加号码,将其添加到List
  5. List转换为数组(请阅读Java API页面)。

如果你假设排序是n*log(n) ,它现在变成n*log(n) + 2 ,我相信它会减少到n*log(n)

小丑限制的解决方案(或者,也许是未承认的学生作业限制)

  1. 对输入数组进行排序。
  2. 创建一个与输入数组大小相同的新数组(将其称为目标数组)。
  3. 运行输入数组(按索引)。 对于每个偶数,将其添加到目标数组。
  4. 运行输入数组(按索引)。 对于每个奇数,将其添加到目标数组。
  5. 使用目标数组执行您想要的操作(可能将其复制到输入数组)。

如果使用快速排序排序,则与List相同的Big-O。

移动数组中的东西并不是那么有效,因为数据是按顺序存储的。如果你不想使用其他结构,你可以改为排序第一个O(nlogn)。虽然排序你可以轻松计算你有多少偶数,所以你知道第一个奇数的位置。 然后创建第二个数组,让我们说b并添加从0开始的所有偶数和从第一个奇数的位置开始的奇数。你可以在O(n)中执行此操作,一个解析

//sort a first
//find odd_index --> 3 in your case

int even_index=0;
for(int i=0; i<a.length; i++){
    if(a[i]%2==0){
        b[even_index]=a[i];
        even_index++;
    }else{
        b[odd_index]=a[i];
        odd_index++;
    }
}

看看这个解决方案:

 public class Test 
 {
   static int [] oddEvenSort(int arr[]){
     int temp[] = new int [arr.length];
     int evenIndex = 0;
     int oddIndex = arr.length - 1;
    arr = sort(arr);
     for(int i = 0;i<arr.length;i++)
     {

         if((arr[i] & 1) == 0){
             temp[evenIndex] = arr[i];
             evenIndex += 1;
         }else
         {
             temp[oddIndex] = arr[i];
            oddIndex -= 1;
         }
     }
    return temp;
 }

 static  int [] sort(int arr[]){
      for(int i=0; i< arr.length;i++)
     {
         for(int j = i;j < arr.length;j++)
         {
         if(arr[j] < arr[i]){
             int temp = arr[i];
             arr[i] = arr[j];
             arr[j] = temp;
         }
         }
     }
     return arr;
 }

public static void main(String[] args)
{
    int arr[] = {1, 3, 2, 7, 5, 4};

    oddEvenSort(arr, arr.length);

    System.out.println(Arrays.toString(arr));
 }
}

你可以做的是在java中使用两个treemap。 一个用于偶数,一个用于奇数。 迭代数字时偶数树图中的偶数和奇数树图中的奇数。 在合并之后,两个树形图首先在一个列表中然后是奇数。

我认为这适用于您的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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