Java中int[]基元数组排序的优化高效方法

Java中int[]基元数组排序的优化高效方法,java,sorting,Java,Sorting,我对按降序排列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

我对按降序排列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;
    }
这是唯一的时间复杂度和O1空间

我可以用更少的代码和更高效的自定义比较函数来实现这一点吗?如果是,怎么做?我要求更少的代码,因为我希望能够在编码比赛/面试中快速编写!谢谢


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

Onlogn time和O1 space是对事物进行排序的理论最佳结果。不,你不能用算法更快地排序。你可以像往常一样,在不改进算法的情况下加快速度,但这样的收益通常很小,转瞬即逝,并且取决于你运行它的架构和月球的相位


除了从数组中复制代码。排序只是为了反转方向,您无法优化运行中的数组以反转数组,尽管您可以按照Sweeper在评论中的建议,更新其余代码以反转用于查找内容的索引。

Onlogn time and O1 space是理论上对内容进行排序的最佳结果。不,你不能用算法更快地排序。你可以像往常一样,在不改进算法的情况下加快速度,但这样的收益通常很小,转瞬即逝,并且取决于你运行它的架构和月球的相位


没有从数组中复制代码。排序只是为了反转方向,您无法优化运行中的数组以反转数组,尽管您可以按照Sweeper在评论中的建议,更新其余代码以反转用于查找内容的索引。

首先,您的代码在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;
 }
但是如果你想保持较低的空间复杂度,我认为你所做的就地修改非常接近你将得到的最小值。即使使用流,它也不会变得更短,但主观上会变得更混乱


另外,不要让事情进一步复杂化,但如果您的数组使用了足够小的范围编辑:更重要的是,您事先知道该范围,您可以使用,即+k时间复杂度与数组。排序首先,您的代码在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;
 }
但是如果你想保持较低的空间复杂度,我认为你所做的就地修改非常接近你将得到的最小值。即使使用流,它也不会变得更短,但主观上会变得更混乱


另外,不要让事情进一步复杂化,但是如果你的数组使用了一个足够小的范围编辑:更重要的是,你事先知道这个范围,你可以使用,这是关于+k时间复杂度与数组的比较。排序

如果你仔细想想,按升序排序的数组实际上和按降序排序的数组是一样的。只是,要访问索引x,您需要访问长度-x-1:-@Sweeper-huh。。。事实上,这是一个非常好的观点!我可没这么想!谢谢与其通过谷歌搜索示例代码来进行研究,我建议您通过获取一本关于数据结构和算法的好教材来进行研究,该教材涵盖了排序,并使用您通过阅读本书获得的知识为自己编写反向排序代码。一本真正好的教科书将包含一个证据,证明O1空间的时间复杂度是再好不过的。旁白:如果面试官要根据你从头开始快速编写最佳排序算法的能力来评判你,他们完全没有抓住要点。这不是一项有用的特定技能,也不是任何高级编程或问题解决能力的象征。@StephenC感谢您的评论!当然,但在问题中,我说的同样有效。。。我希望用更少的代码在Java中找到一种对int[]数组排序的方法,例如,使用lambda函数/自定义比较/等等。我非常感谢您的回复!仔细想想,按升序排序的数组实际上与按降序排序的数组相同。只是,要访问索引x,您需要访问长度-x-1:-@Sweeper-huh。。。事实上,这是一个非常好的观点!我可没这么想!谢谢我建议你不要通过谷歌搜索示例代码来进行研究,而应该通过获取一本关于数据结构和算法的好教材来进行研究,这本书涵盖了排序,一个
d利用阅读本书所获得的知识为自己编写反向排序代码。一本真正好的教科书将包含一个证据,证明O1空间的时间复杂度是再好不过的。旁白:如果面试官要根据你从头开始快速编写最佳排序算法的能力来评判你,他们完全没有抓住要点。这不是一项有用的特定技能,也不是任何高级编程或问题解决能力的象征。@StephenC感谢您的评论!当然,但在问题中,我说的同样有效。。。我希望用更少的代码在Java中找到一种对int[]数组排序的方法,例如,使用lambda函数/自定义比较/等等。我非常感谢您的回复!非常感谢你!有没有办法减少代码行数?通过使用lambda函数,自定义比较,等等。可能类似于Arrays.sortarr,compare?在任何实际设置中我都不建议这样做,但从纯“学术”的角度来看-final int[]I={0};arr=Arrays.streamarr.boxed.sorteda,b->Integer.compareb,a.mapToIntInteger::intValue.toArray;我相信有办法让它更好,我是一个相对新手流。正如您所看到的,这会对Arrays.sort进行装箱和解装箱,并忽略其优化,因此您可能损失的不仅仅是额外的字符。非常感谢!有没有办法减少代码行数?通过使用lambda函数,自定义比较,等等。可能类似于Arrays.sortarr,compare?在任何实际设置中我都不建议这样做,但从纯“学术”的角度来看-final int[]I={0};arr=Arrays.streamarr.boxed.sorteda,b->Integer.compareb,a.mapToIntInteger::intValue.toArray;我相信有办法让它更好,我是一个相对新手流。如您所见,这会装箱和取消装箱,并忽略array.sort的优化,因此您可能丢失的不仅仅是额外的字符。