Python学习算法系列(4):插入排序与快速排序
1. 引言
排序是计算机科学中的一个重要问题,常见的排序算法有冒泡排序、选择排序、插入排序、快速排序等。本篇博客将重点介绍:
- 插入排序(Insertion Sort)
- 快速排序(Quick Sort)
我们将讨论这些算法的基本原理、代码实现及其性能比较。
2. 插入排序(Insertion Sort)
2.1 插入排序原理
插入排序是一种简单的排序算法,它的基本思想是将一个元素插入到已经排好序的序列中。具体过程如下:
- 从数组的第二个元素开始,向前与已排序的元素进行比较。
- 将比当前元素大的元素依次向后移动,直到找到合适的位置插入当前元素。
- 重复该过程直到整个数组排序完成。
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 快速排序原理
快速排序是一种分治算法,它通过一个“基准”元素将数组分为两部分,并递归地对这两部分进行排序。具体过程如下:
- 选择一个“基准”元素,通常是数组的最后一个元素。
- 将数组分为两个部分,左边部分所有元素小于基准元素,右边部分所有元素大于基准元素。
- 递归对左边和右边部分进行排序,直到整个数组有序。
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):归并排序与堆排序,敬请期待!🚀
💡 如果你喜欢这篇文章,欢迎点赞、收藏,并关注本系列!
2281

被折叠的 条评论
为什么被折叠?



