[英]Does Java stream().sorted or list.sort() not increases time complexity?
在进行一些排序时,有些人建议在 Java 中使用
stream().sorted<\/code>或
list.sort()<\/code>方法来降低时间复杂度。
但是,我认为这些方法也使用了一些具有相似时间复杂度的排序算法。
List result = list.stream().sorted((o1, o2)->o1.getItem().getValue().
compareTo(o2.getItem().getValue())).
collect(Collectors.toList());
使用嵌套循环的排序算法通常是
O(n²)<\/code>复杂度,因为内循环的每次迭代都发生在外循环的每次迭代中。
其中一些算法将是
等等;<\/li><\/ul> 但是,其他不使用您提到的嵌套循环,例如,最常用的一般排序算法是 QuickSort,它代表分治算法,它首先选择一个枢轴值并根据所述重新排列数组枢轴值,所有较小的值都在它之前,所有较大的值都在它之后(不一定排序)。
快速排序为O(nlog(n))<\/code>平均案例复杂度。
请记住,一些更高级的排序算法也具有O(n^2)<\/code>的最坏情况复杂度。
事实上,一些排序实现实际上在排序之前对数组进行了洗牌,只是为了避免最坏的情况。
我在下面留下了一些关于 Quicksort 的信息。
关于任何一种算法,你必须了解的第一件无能为力的事情<\/strong>是,仅仅谈论<\/strong>算法不会显着改变你在这方面的知识<\/strong>。
您必须
study and practice them<\/code> ,逐步实现算法。
如果想提高您对排序算法的理解,您需要从
bubble sort<\/code><\/strong>和
insertion sort<\/code><\/strong>等非常基本的开始(
Wikipedia<\/code><\/strong>中的描述和伪代码足以掌握这个想法并开始编码)。
当您对
merge sort<\/code><\/strong>和
快速排序<\/strong><\/a>的基础知识有了深入的了解时。
下面是关于 JDK 提供的所谓的双轴快速排序<\/strong>内部发生的事情的一个小见解<\/strong><\/a>。
事实上,它是一种非常
advanced compound algorithm<\/code><\/strong> ,除了传统的快速排序之外,还需要
merge sort<\/code> 、
heap sort<\/code>和在海量数据集的情况下进行
parallel computing<\/code> 。
只有当您了解基本算法的所有优点
proc and cons<\/code>时(例如为什么存在不同的分区方案,为什么快速排序优于合并排序,同时在更坏的情况下合并排序的时间复杂度似乎更好等)才有意义推测双轴快速排序<\/strong>的
optimizations<\/code> 。
现在简短回答关于内置快速排序的性能:
否则,例如,如果您使用
LinkedList<\/code>拨号,则会在内存中分配一个新数组,并且列表中的所有数据都将复制到该数组中,然后进行排序。
当您使用
stream<\/code>拨号时,它
not affect the source<\/code> 。
来自源的全部数据需要加载到内存中进行排序。 然后您很可能会将其存储在品牌系列中。
这些方法的时间复杂度为nlog(n)
。 这是排序数组的最佳时间复杂度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.