ZetCode

Python Shell Sort 算法

最后修改于 2025年3月8日

在本文中,我们将用 Python 解释 Shell Sort 算法。我们涵盖了按升序和降序对数值和文本数据进行排序。我们还将 Shell Sort 与 Quick Sort 进行比较并进行基准测试。

算法 是解决问题或执行计算的分步过程。算法是计算机科学和编程的基础。

排序 是以特定顺序(例如升序或降序)排列数据的过程。排序对于高效的数据检索和分析至关重要。

常用排序算法

一些常见的排序算法包括

Shell Sort 算法

Shell Sort 是一种有效的排序算法,它通过对特定间隔的元素进行排序来改进插入排序。它通过对原始列表的子列表进行排序来减少比较和交换的次数。

Shell Sort 示例

以下示例演示了 Python 中用于数值数据的 Shell Sort。

shell_sort.py
#!/usr/bin/python

def shell_sort(arr):
    n = len(arr)
    gap = n // 2

    while gap > 0:
        for i in range(gap, n):
            temp = arr[i]
            j = i
            while j >= gap and arr[j - gap] > temp:
                arr[j] = arr[j - gap]
                j -= gap
            arr[j] = temp
        gap //= 2

nums = [12, 34, 54, 2, 3]
shell_sort(nums)
print("Sorted array:", nums)

该示例使用 Shell Sort 以升序对数字列表进行排序。

$ ./shell_sort.py 
Sorted array: [2, 3, 12, 34, 54]

对文本数据进行排序

Shell Sort 也可以对文本数据进行排序。以下示例按升序和降序对字符串列表进行排序。

shell_sort_text.py
#!/usr/bin/python

def shell_sort(arr, reverse=False):
    n = len(arr)
    gap = n // 2

    while gap > 0:
        for i in range(gap, n):
            temp = arr[i]
            j = i
            if reverse:
                while j >= gap and arr[j - gap] < temp:
                    arr[j] = arr[j - gap]
                    j -= gap
            else:
                while j >= gap and arr[j - gap] > temp:
                    arr[j] = arr[j - gap]
                    j -= gap
            arr[j] = temp
        gap //= 2

words = ["apple", "banana", "cherry", "date", "elderberry"]
shell_sort(words)
print("Ascending order:", words)

shell_sort(words, reverse=True)
print("Descending order:", words)

该示例按升序和降序对单词列表进行排序。

$ ./shell_sort_text.py 
Ascending order: ['apple', 'banana', 'cherry', 'date', 'elderberry']
Descending order: ['elderberry', 'date', 'cherry', 'banana', 'apple']

Shell Sort 与 Quick Sort 的比较

Shell Sort 和 Quick Sort 都是有效的排序算法。但是,对于大型数据集,Quick Sort 通常更快。以下示例比较了它们的性能。

compare_sorts.py
#!/usr/bin/python

import time
import random

def shell_sort(arr):
    n = len(arr)
    gap = n // 2

    while gap > 0:
        for i in range(gap, n):
            temp = arr[i]
            j = i
            while j >= gap and arr[j - gap] > temp:
                arr[j] = arr[j - gap]
                j -= gap
            arr[j] = temp
        gap //= 2

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

# Generate a large list of random numbers
data = [random.randint(0, 1000) for _ in range(10000)]

# Benchmark Shell Sort
start_time = time.time()
shell_sort(data.copy())
shell_time = time.time() - start_time

# Benchmark Quick Sort
start_time = time.time()
quick_sort(data.copy())
quick_time = time.time() - start_time

print(f"Shell Sort time: {shell_time:.6f} seconds")
print(f"Quick Sort time: {quick_time:.6f} seconds")

该示例在大型数据集上对 Shell Sort 和 Quick Sort 进行基准测试。

Shell Sort 是一种有效的排序算法,它改进了插入排序。它对中等数据集很有用。但是,对于较大的数据集,Quick Sort 通常更快。了解不同的排序算法有助于为特定用例选择合适的算法。

来源

维基百科上的 Shell Sort

在本文中,我们用 Python 解释了 Shell Sort 算法。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程