Timsort:最快排序算法
Timsort(泰姆排序)是一种混合排序算法,结合了合并排序(Merge Sort)和插入排序(Insertion Sort)的特性。它由Tim Peters在2002年为Python的排序算法而设计,并在Python 2.3版本中首次实现。
Tim Sort 是Python 的sorted()和list.sort()函数使用的默认排序算法。
自从该算法被发明以来,它已被用作Python、Java、Android平台和GNU Octave中的默认排序算法。Java中使用Java的标准库(java.util.Arrays类)来使用Timsort。
import java.util.Arrays; |
这个简单的示例演示了如何使用Java的Arrays.sort()方法对一个整数数组进行排序。在实际应用中,你可以用类似的方式对其他类型的数组或对象数组进行排序。
请注意,Java的Arrays.sort()方法使用了Timsort的实现,因此你不需要自己实现Timsort算法,除非你有特殊的需求。
Timsort:一种非常快速、O(n log n)、稳定的排序算法,专为现实世界构建,而不是在学术界构建。
Timsort的设计目的是克服其他排序算法在特定情况下的性能缺陷。它在实际应用中表现良好,尤其在处理有序数据或包含小规模子数组的数据时效果显著。
Timsort的主要思想是利用现实世界数据的一些特性,例如数据通常部分有序。它采用分而治之的策略,首先将数据分割成小的块,然后对这些块进行排序,最后再将这些有序块合并起来。该算法具有线性对数时间复杂度(O(n log n)),并且在最坏情况下的性能也比较好。
蒂姆排序算法
Tim Sort 背后的主要思想是利用数据中现有的顺序来最大限度地减少比较和交换的次数。它通过将数组划分为已排序的称为运行的小子数组,然后使用修改后的合并排序算法合并这些运行来实现此目的。
以下面的数组为例:arr[] = {4, 2, 8, 6, 1, 5, 9, 3, 7}。
- 步骤 1:定义运行的大小
最小运行规模:32(由于我们的数组较小,因此忽略这一步)
- 步骤 2:将阵列划分为运行
在这一步中,我们将使用插入排序对数组中的小子序列(运行)进行排序。
初始数组[4, 2, 8, 6, 1, 5, 9, 3, 7]
没有初始运行,因此我们将使用插入排序创建运行。
排序后的运行[2, 4], [6, 8], [1, 5, 9], [3, 7]
更新数组:[2, 4, 6, 8, 1, 5, 9, 3, 7]
- 步骤 3:合并运行
在这一步中,我们将使用修改后的合并排序算法合并已排序的运行。
合并运行,直到整个数组排序完毕。
合并运行[2, 4, 6, 8], [1, 3, 5, 7, 9]
更新后的数组:[2, 4, 6, 8, 1, 3, 5, 7, 9]
- 步骤 4:调整运行规模
每次合并操作后,我们都会将运行的大小加倍,直到超过数组的长度。
运行大小加倍:32、64、128(因为我们的数组很小,所以忽略这一步)
- 第 5 步:继续合并
重复合并过程,直到整个数组排序完毕。
最终合并的运行结果[1, 2, 3, 4, 5, 6, 7, 8, 9]
最终排序后的数组为 [1,2,3,4,5,6,7,8,9]。
下面是 TimSort 的实现:
// C++ program to perform TimSort. |
Java程序:
// Java program to perform TimSort. |
Python3
# Python3 program to perform basic timSort |
C代码
// C# program to perform TimSort. |
Javascript
<script> |
Output
Given Array is
-2 7 15 -14 0 15 0 7 -7 -4 -13 5 8 -14 12
After Sorting Array is
-14 -14 -13 -7 -4 -2 0 0 5 7 7 8 12 15 15