【问题标题】:How to separate negative numbers and positive numbers from an array?如何从数组中分离负数和正数?
【发布时间】:2016-03-07 03:09:05
【问题描述】:

我想在一个数组中分隔负数和正数。

例如,如果我的数组有 10 个值并且它们是 {-8,7,3,-1,0,2,-2,4,-6,7},我希望新修改的数组是 { -6,-2,-1,-8,7,3,0,2,4,7}。

我想在 O(n^2) 中执行此操作,并且我也编写了代码。但我没有得到正确的输出。我的代码哪里错了?

import java.util.Random;
public class Apples {

    public static void main(String[] args) {
        Random randomInteger=new Random();
        int[] a=new int[100];
        for(int i=0;i<a.length;i++)
        {
            a[i]=randomInteger.nextInt((int)System.currentTimeMillis())%20 - 10;
        }
        for(int i=0;i<a.length;i++)
        {
            if(a[i]<0)
            {
                int temp=a[i];
                for(int j=i;j>0;j--)
                {
                    a[j]=a[j-1];
                    j--;
                }
                a[0]=temp;
            }
        }
        for(int i=0;i<a.length;i++)
        {
            System.out.print(a[i]+" ");
        }

    }
}

【问题讨论】:

  • 确定数字顺序的规则是什么,尤其是在这些符号相同的情况下?负数输入的反转和非负数输入的顺序相同?
  • 对不起,我不太明白你的评论。我只是想把所有的负数扔到数组的开头。这样到最后,我将在开始时拥有所有负数,然后是正数(包括零)。
  • 删除 j--; 行,因为你是在 for 循环中完成的
  • @Jerry06 非常感谢。那真是个愚蠢的错误。除此之外,代码非常好,对吧?另外,我如何选择您的评论作为正确答案?我是 stackoverflow 的新手,所以我不知道。
  • 将所有负数扔到一边,而将正数扔到另一边可以通过排序算法来完成。更好的是,如果每个组中的顺序无关紧要,只需对 QuickSort 或 HeapSort 算法进行一次迭代,其中枢轴等于 0。

标签: java arrays algorithm big-o


【解决方案1】:

你有两个j--,而你只需要一个,所以删除其中一个。

for(int j=i;j>0;j--)
 {
     a[j]=a[j-1];
     // remove j--; from here
 }

【讨论】:

    【解决方案2】:

    您可以考虑将以下方法作为划分负数/正数的另一种方法。这是基于 K&R 的快速排序,但只对数组进行一次传递:

    import java.util.Random;
    
    public class Sweeper {   
       public static void printArray(int[] a) {
          for (int elt : a) {
             System.out.print(elt + " ");
          }
          System.out.println();
       }
    
       public static void swap(int[] a, int i, int j) {
          int tmp = a[i];
          a[i] = a[j];
          a[j] = tmp;
       }
    
       public static void partition(int[] a, int target) {
          int last = 0;
          for (int i = 0; i < a.length; ++i) {
             if (a[i] < target && i != last) swap(a, i, last++);
          }
       }
    
       public static void main(String[] args) {
          Random rng = new Random();
          int[] a = new int[20];
          for (int i = 0; i < a.length; i++) {
             a[i] = rng.nextInt(20) - 10;
          }
          printArray(a);
          partition(a, 0);
          printArray(a);
       }
    }
    

    【讨论】:

    • 不是必需的,这也会改变元素的顺序,例如,如果输入:-6 7 -10 7 -8 -2 2 -9 8 -2 3 6 -8 4 0 -7 -3 7 7 4,输出将是 -6 -10 -8 -2 -9 -2 -8 -7 -3 7 3 6 2 4 0 7 8 7 7 4,但输出应该是: - 6 -10 -8 -2 -9 -2 -8 -7 -3 7 7 2 8 3 6 4 0 7 7 4
    • @PyThon 订单不是规定的要求。人类用手做事往往是按顺序做的,这就是我对他的例子的看法。
    • @PyThon 顺便提一下,OP 的例子也改变了负数的原始顺序。
    • 对不起各位,如果我的问题不清楚。顺序并不重要。当我解决这个例子时,我只是经历了当时想到的事情。和@pjs 谢谢你的回答。
    • @rohitkrishna094 感谢您的澄清。在这种情况下,这个答案符合您的标准,因为 O(n) 在 O(n^2) 中。
    猜你喜欢
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多