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);
}