📜  排序算法-Tim Sort(1)

📅  最后修改于: 2023-12-03 15:10:10.382000             🧑  作者: Mango

排序算法-Tim Sort

Tim Sort 是一种非常高效的排序算法,最初由Python发明者Guido van Rossum开发,是Python中的默认排序算法。它结合了插入排序和归并排序的优点,可以在非常短的时间内处理大量的数据。

思路

Tim Sort 的核心思想是基于数据的局部性和已经有序或接近有序的子序列,通过归并排序和插入排序算法,将待排序的数据分割成多个子序列,并对这些子序列进行排序。最后通过归并操作将这些子序列合并为一个有序的序列。

在归并排序过程中,Tim Sort 借鉴了自然归并排序的思想,将序列分割成尽量多的有序子序列,这样可以获得有序序列的优势,并且可以利用插入排序中的局部性,对子序列进行插入排序。

算法步骤

Tim Sort 的算法步骤大致如下:

  1. 初始化一个空栈,用于存放待合并的子序列;
  2. 将整个序列分割成多个子序列,并对每个子序列进行插入排序,保证每个子序列都是有序的;
  3. 将所有有序的子序列依次压入栈中,其中栈顶元素为最后一个子序列,栈底元素为最开始的子序列;
  4. 从栈顶开始,取出两个相邻的子序列,将它们合并为一个更大的有序序列;
  5. 不断重复步骤 4,直到栈中仅剩一个子序列,此序列为最终有序序列。
代码实现

以下是使用 Python 实现 Tim Sort 的示例代码:

def insertion_sort(arr, left, right):
    for i in range(left + 1, right + 1):
        key_item = arr[i]
        j = i - 1
        while j >= left and arr[j] > key_item:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key_item
        
def merge(arr, l, m, r):
    len1, len2 = m - l + 1, r - m
    left, right = [], []
    for i in range(0, len1):
        left.append(arr[l + i])
    for i in range(0, len2):
        right.append(arr[m + 1 + i])
 
    i, j, k = 0, 0, l
    while i < len1 and j < len2:
        if left[i] <= right[j]:
            arr[k] = left[i]
            i += 1
        else:
            arr[k] = right[j]
            j += 1
        k += 1
 
    while i < len1:
        arr[k] = left[i]
        k += 1
        i += 1
 
    while j < len2:
        arr[k] = right[j]
        k += 1
        j += 1
 
 
def tim_sort(arr):
    n = len(arr)
    min_run = 32
    for i in range(0, n, min_run):
        insertion_sort(arr, i, min((i + min_run - 1), n - 1))
    size = min_run
    while size < n:
        for start in range(0, n, size * 2):
            mid = start + size - 1
            end = min((start + size * 2 - 1), (n - 1))
            merge(arr, start, mid, end)
        size *= 2
 
    return arr
性能分析

Tim Sort 是一种很快的排序算法,特别适合于处理大数据量的序列。因为它结合了插入排序和归并排序的优点,可以在处理接近有序的数据时,比其它排序算法有更好的性能表现。

在平均情况下,Tim Sort 的时间复杂度为 O(n log n),在最差情况下,时间复杂度为 O(n log n),空间复杂度为 O(n),是一种非常高效的排序算法。