定义:插入排序(Insertion Sort)是一种简单的排序算法,它的工作原理类似于人们手中对扑克牌进行排序的方式。它的主要思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序描述:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果已排序的元素大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2-5
实例详解:
假设有一个数字序列:5 3 8 4 2
插入排序过程:
- 第1次迭代:3 5 8 4 2(将3插入5前面)
- 第2次迭代:3 5 8 4 2(未变化,8已在正确位置)
- 第3次迭代:3 4 5 8 2(将4插入5前面)
- 第4次迭代:2 3 4 5 8(将2插入3前面)
排序后的序列:2 3 4 5 8
排序算法对比:
- 冒泡排序:重复地比较相邻的两个元素,如果他们的位置错误就交换。每次遍历都使当前最大值冒泡至正确位置。
- 选择排序:每次遍历未排序数据,找到最小值并放到排序序列的末尾。
冒泡排序和选择排序与插入排序的区别在于他们不是将元素插入到合适位置,而是不断交换或选择最小值来排序。
NBA场景举例:
假设确定球员的顺序是按照平均得分来排序。插入排序可以被用于分析和排列球员的得分。
将球员的得分视为元素,并使用插入排序方法对他们进行排序。将每个球员按照得分插入到已经排序好的球员列表中,最后得到顺序正确的名单。
实战解析:
插入排序在最好情况下的输入数据本身就是已排序状态,此时时间复杂度为 O(n)。但在最坏情况下时间复杂度为 O(n^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 = [5, 3, 8, 4, 2]
insertion_sort(arr)
print("Sorted array:", arr)
在实际项目中,插入排序可能会被应用于小规模的排序场景。假设我们正在开发一个电子商务平台,需要根据商品的销量进行排序以便用户能更方便地找到热门商品。如果销售商品较少且新商品持续添加,插入排序在这里是个合适的选择。
实际项目应用示例代码:
class Product:
def __init__(self, name, sales):
self.name = name
self.sales = sales
def __repr__(self):
return f"{self.name}: {self.sales}"
def sort_products_by_sales(products):
for i in range(1, len(products)):
key_product = products[i]
j = i - 1
while j >= 0 and products[j].sales < key_product.sales:
products[j + 1] = products[j]
j -= 1
products[j + 1] = key_product
products = [
Product("Product A", 100),
Product("Product B", 500),
Product("Product C", 300),
Product("Product D", 150),
]
sort_products_by_sales(products)
print("Sorted products by sales:", products)
以上示例展示了如何在一个简单的电子商务场景中使用插入排序对商品按销量排序。在这个例子中,我们定义了一个名为 Product
的类,包含商品名称(name)和销量(sales)属性。我们对 sort_products_by_sales
函数进行了修改,以适应此自定义类型。最后根据商品销量对商品列表进行插入排序,从而让用户能更方便地找到热门商品。