Python实战开发及案例分析(7)—— 排序算法

        排序算法是计算机科学中的基础,用于将数据元素按照特定的顺序排列。Python 提供了多种方式来实现排序算法,包括内置的排序函数和手动实现各种经典排序算法。

Python 内置排序函数

Python 的内置函数 sorted() 和列表的 sort() 方法提供了高效的排序功能。这两种方法默认使用 Timsort 算法,这是一种结合了归并排序和插入排序的高效排序算法。

sorted() 函数

  sorted() 函数可以接受任何可迭代对象,并返回一个新的排好序的列表。

示例:排序一组数字和字符串

# 数字排序
numbers = [5, 2, 9, 1, 5, 6]
sorted_numbers = sorted(numbers)
print("Sorted numbers:", sorted_numbers)

# 字符串排序
words = ["banana", "apple", "cherry", "date"]
sorted_words = sorted(words)
print("Sorted words:", sorted_words)
列表的 sort() 方法

        与 sorted() 不同,sort() 方法会就地排序列表,不创建新的列表。

# 就地排序
numbers = [5, 2, 9, 1, 5, 6]
numbers.sort()
print("Sorted numbers in-place:", numbers)

手动实现排序算法

        对于教学和理解排序算法的基本原理,手动实现经典排序算法是非常有用的。

插入排序

        插入排序是一种简单直观的比较排序算法,通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
    return arr

# 示例使用
arr = [12, 11, 13, 5, 6]
insertion_sort(arr)
print("Array sorted using insertion sort:", arr)
快速排序

        快速排序是一种高效的排序算法,采用分治法的策略,通过一个分区操作,将原数组分为两个子数组,左边子数组的元素都比右边子数组的元素小,然后递归地排序两个子数组。

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    else:
        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)

# 示例使用
arr = [3, 6, 8, 10, 1, 2, 1]
sorted_arr = quick_sort(arr)
print("Array sorted using quick sort:", sorted_arr)

结论

        排序算法是数据结构和算法学习的基础,对于优化数据处理和搜索算法非常重要。Python 的内置排序方法提供了高效和简单的解决方案,而手动实现这些算法则有助于深入理解其背后的原理和特点。在实际应用中,选择合适的排序算法可以根据具体需求进行,例如数据大小、数据结构的特性和所需的效率。通过这些示例,我们可以看到不同排序算法在处理相同数据时的效果和性能差异。

        继续探讨更多的排序算法,我们可以深入学习一些其他重要的经典排序算法,如归并排序和堆排序。这些算法在不同的应用场景中表现出了不同的性能优势,特别是在处理大规模数据集时。

归并排序

        归并排序是一种有效的排序算法,采用分治法的策略来实现。它将数组分割成两半,分别排序,然后将它们合并在一起。这种方法在最坏、平均和最佳情况下都提供 𝑂(𝑛log⁡𝑛)O(nlogn) 的时间复杂度。

Python 实现:        

def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2  # 找到中间位置
        left_half = arr[:mid]
        right_half = arr[mid:]

        merge_sort(left_half)  # 对左半部分递归排序
        merge_sort(right_half)  # 对右半部分递归排序

        i = j = k = 0

        # 合并两半
        while i < len(left_half) and j < len(right_half):
            if left_half[i] < right_half[j]:
                arr[k] = left_half[i]
                i += 1
            else:
                arr[k] = right_half[j]
                j += 1
            k += 1

        # 检查是否有剩余
        while i < len(left_half):
            arr[k] = left_half[i]
            i += 1
            k += 1

        while j < len(right_half):
            arr[k] = right_half[j]
            j += 1
            k += 1

    return arr

# 示例使用
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort(arr)
print("Array sorted using merge sort:", sorted_arr)

结论

        归并排序和堆排序提供了不同于简单排序算法(如插入排序或冒泡排序)的性能优势,尤其在处理大规模数据集时表现出更好的稳定性和效率。通过动手实现这些算法,不仅可以加深对其工作原理的理解,还可以提高解决实际排序问题的能力。在实际应用中,选择合适的排序算法可以根据数据的特性和所需的操作效率来决定。

        继续深入探讨更多高级排序算法,我们可以讨论希尔排序和计数排序。这些算法通过不同的策略来优化排序过程,适用于特定类型的数据集。

希尔排序

        希尔排序(也称为递减增量排序算法)是一种基于插入排序的算法。它首先排序间隔较远的元素,然后逐渐减少间隔距离。希尔排序比传统的插入排序更高效,因为它允许元素一次移动较远的距离。

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  # 减少间隔
    return arr

# 示例使用
arr = [35, 33, 42, 10, 14, 19, 27, 44]
sorted_arr = shell_sort(arr)
print("Array sorted using shell sort:", sorted_arr)

计数排序

        计数排序是一种非基于比较的排序算法,适用于一定范围内的整数排序。它计算每个元素的出现次数,然后根据元素的计数来放置元素在其正确位置。计数排序是一个线性时间复杂度的排序算法,当输入的元素是 n 个在一定范围内的整数时,它非常高效。

Python 实现:

def counting_sort(arr, max_val):
    n = len(arr)
    count = [0] * (max_val + 1)  # 计数数组
    output = [0] * n  # 输出数组

    # 存储每个元素的计数
    for num in arr:
        count[num] += 1

    # 计数数组变形,后面的元素等于前面的元素之和
    for i in range(1, max_val + 1):
        count[i] += count[i - 1]

    # 反向填充目标数组,保持排序的稳定性
    for i in range(n - 1, -1, -1):
        output[count[arr[i]] - 1] = arr[i]
        count[arr[i]] -= 1

    return output

# 示例使用
arr = [4, 2, 2, 8, 3, 3, 1]
max_val = max(arr)  # 找到最大值
sorted_arr = counting_sort(arr, max_val)
print("Array sorted using counting sort:", sorted_arr)

结论

        希尔排序和计数排序提供了不同的方法来处理排序问题。希尔排序通过分组和逐步细化的插入排序加快排序过程,而计数排序则完全脱离了比较排序的范畴,通过计算元素的出现频率来实现排序。这些算法在适当的场景下使用可以显著提高排序效率,如希尔排序适合中等大小的数组,而计数排序适用于有明确范围的整数数组。在实际选择排序算法时,了解数据的性质和需求是非常关键的,以确保算法的效率和适用性。

相关推荐

  1. Python实战开发案例分析7)—— 排序算法

    2024-05-09 10:32:05       32 阅读
  2. Python实战开发案例分析(5)—— 贪心算法

    2024-05-09 10:32:05       39 阅读
  3. Python实战开发案例分析(16)—— 遗传算法

    2024-05-09 10:32:05       29 阅读
  4. Python实战开发案例分析(1)——Web开发

    2024-05-09 10:32:05       29 阅读
  5. Python实战开发案例分析(2)——单目标优化

    2024-05-09 10:32:05       35 阅读
  6. Python实战开发案例分析(6)—— 动态规划

    2024-05-09 10:32:05       32 阅读
  7. Python实战开发案例分析(3)——多目标优化

    2024-05-09 10:32:05       38 阅读
  8. Python实战开发案例分析(11)—— b树

    2024-05-09 10:32:05       37 阅读
  9. Python实战开发案例分析(15)—— 支持向量机

    2024-05-09 10:32:05       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-09 10:32:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-09 10:32:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-09 10:32:05       82 阅读
  4. Python语言-面向对象

    2024-05-09 10:32:05       91 阅读

热门阅读

  1. .NET_NLog

    .NET_NLog

    2024-05-09 10:32:05      34 阅读
  2. SpringCache

    2024-05-09 10:32:05       35 阅读
  3. git cherry-pick冲突解决

    2024-05-09 10:32:05       31 阅读
  4. springBoot异常总结

    2024-05-09 10:32:05       23 阅读
  5. R-Tree原理及实现代码

    2024-05-09 10:32:05       37 阅读
  6. 最短路径题型总结

    2024-05-09 10:32:05       32 阅读