繁体   English   中英

在 Java 中对 int[] 原始数组进行排序的优化和高效方式

[英]Optimized and efficient way to sort int[] primitive array in Java

我对 int[] 原始数组按降序排序进行了大量研究,但大多数方法建议创建一个 ArrayList,然后使用 Collections.sort()。

目前,我已经尝试过:

    int arr[] = new int[] {1,5,6,3,2};
    Arrays.sort(arr);

    for(int i = 0; i <= arr.length / 2; i++) {
        int temp = arr[i];
        arr[i] = arr[arr.length - i - 1];
        arr[arr.length - i - 1] = temp;
    }

这是 O(nlogn) 时间复杂度和 O(1) 空间。

我可以使用自定义 compare() function 以更少的代码和高效地执行此操作吗? 如果是这样,怎么做? 我要求更少的代码,因为我希望能够在编码竞赛/面试中快速编写它! 谢谢!

更新:我知道时间和空间复杂性是他们能得到的最好的,但是是否可以用更少的代码行对数组进行排序。 例如,通过使用自定义比较/lambda 函数/等?

O(nlogn) 时间和 O(1) 空间是排序事物的理论最佳结果。 不,你不能在算法上更快地排序。 像往常一样,您可以在不改进算法的情况下稍微加快速度,但这种增益通常很小、稍纵即逝,并且取决于您运行它的架构和月相。

没有从 Arrays.sort 复制代码只是为了反转方向,你不能优化 O(n) 运行来反转数组,尽管你可以,正如 Sweeper 在评论中建议的那样,将代码的 rest 更新为反转用于查找内容的索引。

首先,您的代码在 for 循环的第 2 行和第 3 行存在一些问题,因为它尝试访问的第一个索引是“6”,它不存在。 for 循环的最后一行有一个额外的]

所以,我认为这就是你的意思,如果我错了,请随时纠正我!

 for(int i = 0; i <= arr.length / 2; i++) {
     int temp = arr[i];
     arr[i] = arr[arr.length - i - 1];
     arr[arr.length - i - 1] = temp;
 }

但是,如果您想保持较低的空间复杂度,我认为您所拥有的就地修改非常接近您将获得的尽可能小。 即使使用流,它也不会变得更短(但会在主观上变得更加混乱)。

此外,不要让事情进一步复杂化,但如果您的数组使用足够小的范围(编辑:更重要的是,您事先知道该范围),您可以使用计数排序,这是 O(n+k) 时间复杂度与Arrays.sort()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM