我发现dart语言在List类中具有内置的sort方法,我想知道他们在此方法中使用的算法是什么,以及Big O表示法是什么?
答案 0 :(得分:3)
我发现dart语言在List类中具有内置的sort方法,我想知道他们在此方法中使用的算法是什么,以及Big O表示法是什么?
如果我们查看一下SDK,可以在sort
上找到List
方法的以下实现:
void sort([int compare(E a, E b)]) {
Sort.sort(this, compare ?? _compareAny);
}
仅将排序转发到以下内部帮助程序类:
关于排序算法有以下评论:
/**
* Dual-Pivot Quicksort algorithm.
*
* This class implements the dual-pivot quicksort algorithm as presented in
* Vladimir Yaroslavskiy's paper.
*
* Some improvements have been copied from Android's implementation.
*/
这种排序算法实际上与Java(至少Java 7)中使用的算法相同:
http://www.docjar.com/html/api/java/util/DualPivotQuicksort.java.html
在这里我们可以看到O标记主要是O(n log(n))
:
* This class implements the Dual-Pivot Quicksort algorithm by
* Vladimir Yaroslavskiy, Jon Bentley, and Josh Bloch. The algorithm
* offers O(n log(n)) performance on many data sets that cause other
* quicksorts to degrade to quadratic performance, and is typically
* faster than traditional (one-pivot) Quicksort implementations.
有关更多详细信息,您可以阅读Dual-Pivot Quicksort算法设计者的论文:
但是,还请注意,Dart还具有以下常量:
// When a list has less then [:_INSERTION_SORT_THRESHOLD:] elements it will
// be sorted by an insertion sort.
static const int _INSERTION_SORT_THRESHOLD = 32;
...
static void _doSort<E>(
List<E> a, int left, int right, int compare(E a, E b)) {
if ((right - left) <= _INSERTION_SORT_THRESHOLD) {
_insertionSort(a, left, right, compare);
} else {
_dualPivotQuicksort(a, left, right, compare);
}
}
因此对于小列表,使用传统的插入排序算法更有意义,该算法的最坏情况下的大O为О(n^2)
。但是,由于输入量很小,因此它比Dual-Pivot Quicksort算法要合适。
答案 1 :(得分:0)
在https://dartpad.dartlang.org/,尝试以下代码。我无法回答您有关幕后实现的问题,但您可以打赌它是O(n log n)。
我使用答案是因为我无法轻松地在注释中提供代码。
void main() {
Map<String, int> map = {'a': 1, 'b': 2};
List<String> list = ['banana', 'apple', 'age', 'bob'];
list.sort((String a, String b) => a.compareTo(b));
print(list);
}
BTW list.sort();
将给出相同的结果,因为该自定义比较器与默认比较器相同。