[英]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:不使用“<”和“>”比较项目,而是使用函数。
简单解决方案
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)中执行此操作,一个解析
//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.