在未排序的数组中排序正整数

时间:2014-01-24 22:39:29

标签: java arrays sorting

这是在最近的一次编程采访中给我的。我给出了一个带有负值和正值的未排序数组,并且需要对它们进行排序,但仅对正值进行排序。我想知道你的一些解决方案可能没有使用谷歌。

回家后我发现 Arrays.sort()按升序对数组进行排序,但我不知道如何输出只有正值的新数组,因为这是一个要求。如果它们大于-1,我可以通过打印来打印它们,但是如何将它们输入到新数组中而不必遍历数组并计算正值的数量以获得新数组的大小,实例化新数组,然后再循环将它们添加到新数组..这个解决方案似乎不是最优的,有更好的方法吗?

输出需要是一个只有正值的新数组,已排序

以下是我目前的情况:

  import java.util.Arrays;


    public class Test {

        public static void main(String[] args) {
            // TODO Auto-generated method stub      
            int[] unsorted = {
                -3, 95, -4, 20, 5, 6, 8
            };
            int[] sorted = unsorted;
            Arrays.sort(sorted);

            for (int s: sorted) {
                if (s > -1)
                    System.out.println(s);
            }
        }

    }

7 个答案:

答案 0 :(得分:3)

您可以尝试将数据放入PriorityQueue,确保只处理正值:

int[] unsorted = { -3, 95, -4, 20, 5, 6, 8 };

PriorityQueue<Integer> q = new PriorityQueue<>(unsorted.length);

for (int a : unsorted) {
    if (a > 0)
        q.add(a);
}

while (!q.isEmpty()) {
    System.out.println(q.poll());
}
5
6
8
20
95

这种方法将是 O(nlog(n)),其中 n 是数组中正整数的数量。相反,对整个数组进行排序将是 O(nlog(n)),其中 n 是整个数组的长度。

答案 1 :(得分:1)

如果您对已排序的数组执行了0的二进制搜索,然后只打印了该点上的值,该怎么办? Arrays.binarySearch()会返回0如果在您的数组中找不到0将会出现的索引。

import java.util.Arrays;

public class Test {

    public static void main(String[] args) {    
        int[] unsorted = {
            -3, 95, -4, 20, 5, 6, 8
        };
        int[] sorted = unsorted;
        Arrays.sort(sorted);

        int breakingPoint = Arrays.binarySearch(sorted, 0);
        for (int i = breakingPoint; i < sorted.length; i++) {
            System.out.println(sorted[i]);
        }
    }

}

答案 2 :(得分:1)

您应该制作自己的排序算法。我会在采访中使用改进的quicksort:

1-pick 0作为第一次递归调用的枢轴,并将所有等于或大于0的数字放在右边的数组上

2 - 仅在第一次递归调用的右侧数组上调用quicksort,对于其他递归调用,使用随机数据透视。

3-连接时,删除找到的第一个。

快速(nlogN),您甚至可以在同一个数组中执行此操作,也可以返回一个新数组。

答案 3 :(得分:0)

在Java中,Collection.sort必须是稳定的,所以如果你使用的是一个比较器,表明所有的负数都相等,但对于正数而言,你做的就是你所期望的,你就是这样。有你需要的。

答案 4 :(得分:0)

  1. 迭代数组
  2. 对于每个正值,将位置和值存储到两个数组中
  3. 对值数组进行排序

答案 5 :(得分:0)

仅为动态方面创建列表意味着可能会在删除过程中多次调整数组大小。

在我知道需要多大的数据之后,我选择使用Arrays.copyOf来调整数组的大小。

我做的第一件事就是过滤掉否定词:

int[] unsorted = {
    -3, 95, -4, 20, 5, 6, 8
};

int[] positives = new int[unsorted.length]; //It can only be as big as unsorted.

int i = 0, j = 0;

for (; i < unsorted.length; i++) {
    if (unsorted[i] >= 0)
        positives[j++] = unsorted[i];
}

然后,我调整数组的大小:

positives = Arrays.copyOf(positives, j);

最后,我对它进行了排序:

Arrays.sort(positives);

这是IDEOne.com demo

答案 6 :(得分:0)

简单地将正数分开 - 它需要一个副本

List<Integer> positives = new ArrayList<Integer>();
for (Integer number: unsorted) {
    if (number > 0) {
        positives.add(number);
    }
}

然后对它们进行排序。

Collections.sort(positives);