Python学习算法系列(4):插入排序与快速排序

Python学习算法系列(4):插入排序与快速排序

1. 引言

排序是计算机科学中的一个重要问题,常见的排序算法有冒泡排序、选择排序、插入排序、快速排序等。本篇博客将重点介绍:

  • 插入排序(Insertion Sort)
  • 快速排序(Quick Sort)

我们将讨论这些算法的基本原理、代码实现及其性能比较。


2. 插入排序(Insertion Sort)

2.1 插入排序原理

插入排序是一种简单的排序算法,它的基本思想是将一个元素插入到已经排好序的序列中。具体过程如下:

  1. 从数组的第二个元素开始,向前与已排序的元素进行比较。
  2. 将比当前元素大的元素依次向后移动,直到找到合适的位置插入当前元素。
  3. 重复该过程直到整个数组排序完成。

2.2 插入排序代码实现

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]  # 当前元素
        j = i - 1
        # 将比当前元素大的元素移到后面
        while j >= 0 and arr[j] > key:
            arr[j + 1] = arr[j]
            j -= 1
        # 插入当前元素
        arr[j + 1] = key

# 测试插入排序
arr = [64, 34, 25, 12, 22, 11, 90]
insertion_sort(arr)
print("排序后的数组:", arr)  # 输出 [11, 12, 22, 25, 34, 64, 90]

2.3 插入排序时间复杂度

插入排序的时间复杂度为:

  • 最好情况:O(n)(当数组已经排序时)
  • 最坏情况:O(n^2)(当数组完全逆序时)

3. 快速排序(Quick Sort)

3.1 快速排序原理

快速排序是一种分治算法,它通过一个“基准”元素将数组分为两部分,并递归地对这两部分进行排序。具体过程如下:

  1. 选择一个“基准”元素,通常是数组的最后一个元素。
  2. 将数组分为两个部分,左边部分所有元素小于基准元素,右边部分所有元素大于基准元素。
  3. 递归对左边和右边部分进行排序,直到整个数组有序。

3.2 快速排序代码实现

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) - 1]  # 选择基准元素
    left = [x for x in arr[:-1] if x <= pivot]  # 小于等于基准的元素
    right = [x for x in arr[:-1] if x > pivot]  # 大于基准的元素
    return quick_sort(left) + [pivot] + quick_sort(right)

# 测试快速排序
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = quick_sort(arr)
print("排序后的数组:", sorted_arr)  # 输出 [11, 12, 22, 25, 34, 64, 90]

3.3 快速排序时间复杂度

快速排序的时间复杂度为:

  • 最好情况:O(n log n)(当每次选择的基准元素都能够将数组平分)
  • 最坏情况:O(n^2)(当每次选择的基准元素都是最大或最小元素)
  • 平均情况:O(n log n)

由于快速排序的平均性能较好,因此它在大多数情况下都表现出较优的排序效果。


4. 排序算法的性能比较

以下是 插入排序快速排序 与其他常见排序算法的时间复杂度比较:

算法时间复杂度(最好情况)时间复杂度(最坏情况)空间复杂度
冒泡排序O(n)O(n^2)O(1)
选择排序O(n^2)O(n^2)O(1)
插入排序O(n)O(n^2)O(1)
快速排序O(n log n)O(n^2)O(log n)
归并排序O(n log n)O(n log n)O(n)

5. 总结

  • 插入排序:适用于小规模数据集,最坏情况下的性能较差,但对于近乎有序的数组,它具有较高的效率。
  • 快速排序:适用于大规模数据集,虽然最坏情况下的时间复杂度为 O(n^2),但由于其平均时间复杂度为 O(n log n),因此在实际应用中通常表现出较优的性能。
  • 排序算法优化:对于大数据集,快速排序和归并排序通常是最推荐的选择。

📢 下一篇 Python学习算法系列(5):归并排序与堆排序,敬请期待!🚀

💡 如果你喜欢这篇文章,欢迎点赞、收藏,并关注本系列!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值