我有点坚持这种逻辑 . 让我说我有 int
的数组 . 我需要的是将偶数和奇数分开,即所有偶数应按排序顺序排在第一位,然后按排序顺序排列所有奇数 .
This needs to be done with array only not collection.
输入将是 .
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
进行排序 .
但我认为这不是一个好方法 . 任何人都可以通过算法和代码示例帮助我理解这个逻辑 .
5 回答
应用任何排序算法并将比较器用作比偶数“小于”奇数的偶数 . 这使您可以使用良好的排序算法,同时仍按您希望的方式对元素进行排序 .
这是我的gnome排序实现和我的比较功能:
工作良好 . 尝试其他排序算法 .
TL; DR:使用函数,而不是使用“<”和“>”比较项目 .
简单解决方案
对输入数组进行排序 .
创建一个具体的
List
. 使用您想要的任何实现;LinkedList
似乎适合 .运行输入数组一次 . 对于每个偶数,将其添加到
List
.再次运行输入数组 . 对于每个添加号码,将其添加到
List
.将
List
转换为数组(为此读取Java API页面) .如果您认为排序是
n*log(n)
,它现在变为n*log(n) + 2
,我相信,它会缩减回n*log(n)
.小丑限制的解决方案(或者,也许是未承认的学生作业限制)
对输入数组进行排序 .
创建一个与输入数组大小相同的新数组(将其称为目标数组) .
运行输入数组(按索引) . 对于每个偶数,将其添加到目标数组 .
运行输入数组(按索引) . 对于每个奇数,将其添加到目标数组 .
使用目标数组执行您想要的操作(可能将其复制到输入数组) .
如果使用快速排序排序,则与
List
相同的Big-O .移动数组中的东西并不是那么有效,因为数据是按顺序存储的 . 如果你不想使用其他结构,你可以改为排序第一个O(nlogn) . 虽然排序你可以轻松计算你有多少偶数,所以你知道第一个奇数的位置 . 然后创建第二个数组,让我们说b并添加从0开始的所有偶数和从第一个奇数的位置开始的奇数 . 你可以在O(n)中执行此操作,一个解析
看看这个解决方案:
你可以做的是在java中使用两个treemap . 一个用于偶数,一个用于奇数 . 迭代数字时偶数树图中的偶数和奇数树图中的奇数 . 在合并之后,两个树形图首先在一个列表中然后是奇数 .
我认为这适用于您的情况 .