Java 对数组中的偶数和奇数进行排序

Java 对数组中的偶数和奇数进行排序,java,arrays,Java,Arrays,我正试图将数组分成奇数和偶数两个数字。请注意,最终结果中的排序数字并不重要。我正在编译代码,输出中包含一些bug。我的代码正确地排列了奇数数字,而偶数数字给我带来了一些麻烦。有人能帮我安排一下偶数的排列吗 基本上,我将odd数字排列在数组的左侧,并在开始时将oddPos=0偶数数字位于右侧,定位从阵列的最末端开始evenPos=myArray.length-1 public class EvenOddArray { public static void main(String[] ar

我正试图将数组分成
奇数
偶数
两个数字。请注意,最终结果中的排序数字并不重要。我正在编译代码,输出中包含一些bug。我的代码正确地排列了
奇数
数字,而
偶数
数字给我带来了一些麻烦。有人能帮我安排一下
偶数的排列吗

基本上,我将
odd
数字排列在数组的左侧,并在开始时将
oddPos=0
偶数
数字位于右侧,定位从阵列的最末端开始
evenPos=myArray.length-1

public class EvenOddArray {

    public static void main(String[] args){

        int[] myArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};


        int oddPos = 0;
        int evenPos = myArray.length - 1;

        for(int i = 0; i < myArray.length; i++){
            if(myArray[i] % 2 == 0){
                myArray[evenPos] = myArray[i];
                evenPos--;
            }
            else{
                myArray[oddPos] = myArray[i];
                oddPos++;
            }
        }

        for(int i = 0; i < myArray.length; i++){
            System.out.print(myArray[i] + " ");
        }
    }
}
int电流=0;
int evenPos=myArray.Length-1;
while(当前
一个有趣的版本:

for (int curPos=0, evenPos=myArray.length-1; curPos < evenPos;)
    if (myArray[curPos] % 2 == 0)
        swap(myArray, evenPos--, curPos);
    else
        curPos++;
for(int curPos=0,evenPos=myArray.length-1;curPos
更有趣的版本:

for (int curPos=0, evenPos=myArray.length-1; curPos < evenPos;)
    swap(myArray, curPos, myArray[curPos]%2==0 ? evenPos-- : curPos++);
for(int curPos=0,evenPos=myArray.length-1;curPos
说明:

当数字为奇数时,不必交换值。只有你 增加当前计数器

也不能将for循环计数器用作数组的索引。到 不会错过交换到计数器索引的数字 处理。这是其他答案没有涵盖的错误


实际上,您正在编辑相同的
myArray
数组,同时从中读取。所以发生的是

在循环的第6次迭代中,将6插入到
myArray[7]
th位置。因此,在第7次迭代中,当您阅读
myArray[7]
时,它是6。不是8。因为,在上一次迭代中,您用6写了8

因此,请使用单独的数组保存结果。希望你明白我的意思

你可以这样做

    int[] myArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int[] resultArray = new int[myArray.length];
    int oddPos = 0;
    int evenPos = myArray.length - 1;

    for(int i = 0; i < myArray.length; i++){
        if(myArray[i] % 2 == 0){
            resultArray[evenPos] = myArray[i];
            evenPos--;
        }
        else{
            resultArray[oddPos] = myArray[i];
            oddPos++;
        }
    }
int[]myArray={1,2,3,4,5,6,7,8,9,10};
int[]resultArray=newint[myArray.length];
int-oddPos=0;
int evenPos=myArray.length-1;
for(int i=0;i
让我们看看for循环的每次迭代都会发生什么

  • 原件:12345678910
  • 第一次国际热核实验堆:12345678910
  • 第二次国际热核实验堆:1234567892
  • 第三次国际热核实验堆:1 3 4 5 6 7 8 9 2
  • 第四届国际热核实验反应炉:1 3 3 4 5 6 7 8 4 2
  • 第五届国际热核实验堆:135567842
  • 第六届国际热核实验堆:1 35 4 5 6 7 6 4 2
  • 第七届国际热核实验堆:135567642
  • 第八届国际热核实验堆:13556442
  • 第九届国际热核实验堆:135546642
  • 第十届国际热核实验堆:135724642
如您所见,您正在修改数组“inplace”。您正在修改数组,但未使用所有值。例如,看看9,它在被访问之前就被重写了。所以,你的算法是错误的

建议:

  • 使用新数组保存结果,如tibzon的答案所示
  • 使用交换而不是覆盖。你必须相应地更新你的算法。我打算提供一个。但Murenik已经提供了一个

    • 这是我的优化版本,与@hasan83版本相比,它使用了大约一半的掉期

          int n = myArray.length;
          int oddPos = 0;
          int evenPos = n - 1;
          while (true) {
              while (oddPos < n && myArray[oddPos] % 2 == 1) {
                  oddPos++;
              }
              while (evenPos >= 0 && myArray[evenPos] % 2 == 0) {
                  evenPos--;
              }
              if (oddPos >= evenPos) break;
              swap(myArray, oddPos, evenPos);
          }
      
      int n=myArray.length;
      int-oddPos=0;
      int-evenPos=n-1;
      while(true){
      而(oddPos=0&&myArray[evenPos]%2==0){
      伊文波斯--;
      }
      如果(oddPos>=evenPos)中断;
      交换(myArray、oddPos、evenPos);
      }
      
      您正在覆盖尚未处理的输入。为输出使用新数组,或将目标位置与未处理的位置交换。@CodesInChaos,您能解释一下覆盖尚未处理的输入的原因吗?我不明白这一点,除非您真的需要避免额外的数组分配的开销,否则我建议对输入和输出使用单独的数组。它实现起来更简单,使用起来也更容易。我会将结束条件更改为比较
      current
      evenPos
      。一旦您超越了
      evenPos
      ,您所要做的就是将元素与自身交换
      i
      也是毫无意义的,因此我将用
      while
      循环替换
      for
      循环。比如说
      while(current
      我喜欢它。更快、更少的代码。编辑它以获得认可:)很好的解决方案!虽然我为您的解决方案制作了一个优化版本,但避免交换阵列右侧已有的偶数。:)如果号码为偶数,则将号码与其自身进行交换,这是正确答案。而且很清楚。但它不是最快的一个,它使用更多的内存。比我建议的和更新的@CodesInChaos@hasan83是的,你说得对。但我的意图是通过做最少的更改来解决这个问题,而不增加更多的逻辑来交换元素。但我认为在速度方面,这种方法没有什么大问题。非常感谢。。!回报了这个人情!;)
          int[] myArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
          int[] resultArray = new int[myArray.length];
          int oddPos = 0;
          int evenPos = myArray.length - 1;
      
          for(int i = 0; i < myArray.length; i++){
              if(myArray[i] % 2 == 0){
                  resultArray[evenPos] = myArray[i];
                  evenPos--;
              }
              else{
                  resultArray[oddPos] = myArray[i];
                  oddPos++;
              }
          }
      
          int n = myArray.length;
          int oddPos = 0;
          int evenPos = n - 1;
          while (true) {
              while (oddPos < n && myArray[oddPos] % 2 == 1) {
                  oddPos++;
              }
              while (evenPos >= 0 && myArray[evenPos] % 2 == 0) {
                  evenPos--;
              }
              if (oddPos >= evenPos) break;
              swap(myArray, oddPos, evenPos);
          }