使用比较器的原始数组排序

问题描述 投票:-3回答:1

我正在解决以下问题,并试图找到更好,更干净的排序方式。

问题1.我只是意识到Arrays.sort(arr,Comparator)不能与int [] arr一起使用。我需要转换为Integer []进行排序。还有其他方法可以直接对int []进行排序吗?2.有没有更好的方法编写此程序?

参考:https://www.pramp.com/challenge/4E4NW7NjbnHQEx1AxoXE

绝对值排序给定一个整数数组arr,编写一个函数absSort(arr),该函数根据arr中数字的绝对值对该数组进行排序。如果两个数字具有相同的绝对值,请按正负号排序,负号位于正数之前。

示例:

input:arr = [2,-7,-2,-2,0]输出:[0,-2,-2,2,-7]

我的解决方案

static int[] absSortArray(int[] arr) {

        Integer[] input = new Integer[arr.length];
        for (int i=0; i < input.length; i++) {
            input[i] = arr[i];
        }

        Arrays.sort(input, (a, b) -> ((Math.abs(a) == Math.abs(b)) ? ((a < b) ? -1 : 1) : (Math.abs(a) < Math.abs(b)) ? -1 : 1));

        int[] output =  new int[input.length];
        for (int i=0; i < input.length; i++) {
            output[i] = input[i];
        }

        return output;
    }

java arrays sorting comparator
1个回答
0
投票

您可以编写自己的数组排序。一种不错的方法是将原始数组视为N个排序为1的列表的列表,因此将其复制到如下排序的新数组中:将前两个列表合并为2的排序列表,将后两个列表合并为a 2的排序列表,将这些列表合并为4的排序列表,重复4个新列表,合并为8的排序列表,依此类推。您可以使用当前元素计数中的零位来告诉您何时合并几个。它具有非常多级缓存,RAM和VM友好的优势,因为它首先处理小型集合,每次通过时将集合大小加倍,返回到最近的提升年龄值。

[另一个收藏夹是将数据移到有序列表:树,特里,跳过列表。甚至C都有一棵树:tsearch()。如果可用的工具需要一个对象或结构,请进行简单的处理。有时,当有数据解决方案时,人们会寻找代码解决方案。如果输入的到达是渐进的,则这特别好,这种添加随每次添加而发生,并且可以在添加最后一项时立即输出。

对于小列表,我对插入排序或冒泡排序n ^ 2/2没问题。

如果值不是唯一的,则具有值和计数的类/结构会使它们唯一且更紧凑。

© www.soinside.com 2019 - 2024. All rights reserved.