一个可靠的例子(或一些业务用例),其中稳定排序产生显着差异
A solid example (or some business use case) where Stable sort makes a significant difference
我想知道稳定排序会产生巨大影响的场景。
JAVA 的早期版本对 collections.sor API 进行了合并排序,这是一种稳定的排序,而对于 Array.sort,则使用了快速排序。 Java 的当前版本使用 Tim Sort,它又是稳定排序。
所以现在如果你会看到大多数流行的语言,如 Python、Java,Scala 都在使用 Tim Sort。我想知道 Tim Sort 在其使用中稳定排序的权重是多少。
推动使用稳定排序技术的强大动机是什么?
通过稳定排序,可以一次按一个字段对数据集进行排序,从最不重要到最重要。例如,某些电子表格程序有一次只能按 3 个字段排序的限制。由于电子表格排序是稳定的,因此 6 字段排序是可能的,首先按 3 个最不重要的字段排序,然后按 3 个最重要的字段排序。保留原始顺序可能是理想的副作用。假设一个数据集按名称排序,然后该数据集的副本按出生日期排序,具有相同出生日期的元素将保留其原始名称排序,而不需要进行复杂的比较。
快速排序与归并排序也存在性能问题。通常,合并排序执行更多的移动,但更少的比较。如果比较开销大于移动开销,则合并排序更快。例如,如果对指向对象的指针数组进行排序(这就是我认为 Java 实现对象数组的方式),那么合并排序会更快,因为移动的是指针,比较的是指针是对象。
我想知道稳定排序会产生巨大影响的场景。
JAVA 的早期版本对 collections.sor API 进行了合并排序,这是一种稳定的排序,而对于 Array.sort,则使用了快速排序。 Java 的当前版本使用 Tim Sort,它又是稳定排序。 所以现在如果你会看到大多数流行的语言,如 Python、Java,Scala 都在使用 Tim Sort。我想知道 Tim Sort 在其使用中稳定排序的权重是多少。 推动使用稳定排序技术的强大动机是什么?
通过稳定排序,可以一次按一个字段对数据集进行排序,从最不重要到最重要。例如,某些电子表格程序有一次只能按 3 个字段排序的限制。由于电子表格排序是稳定的,因此 6 字段排序是可能的,首先按 3 个最不重要的字段排序,然后按 3 个最重要的字段排序。保留原始顺序可能是理想的副作用。假设一个数据集按名称排序,然后该数据集的副本按出生日期排序,具有相同出生日期的元素将保留其原始名称排序,而不需要进行复杂的比较。
快速排序与归并排序也存在性能问题。通常,合并排序执行更多的移动,但更少的比较。如果比较开销大于移动开销,则合并排序更快。例如,如果对指向对象的指针数组进行排序(这就是我认为 Java 实现对象数组的方式),那么合并排序会更快,因为移动的是指针,比较的是指针是对象。