直接插入排序法的简单介绍
# 直接插入排序法## 简介直接插入排序 (Insertion Sort) 是一种简单直观的排序算法。它的工作原理类似于我们整理扑克牌的过程:从第二张牌开始,依次将每张牌插入到前面已排序好的牌序列中正确的位置。 它是一种原地排序算法,空间复杂度较低,但时间复杂度相对较高,因此更适合小规模数据的排序。## 算法流程### 1. 基本思想直接插入排序的基本思想是将待排序的序列分成已排序部分和未排序部分两部分。初始时,已排序部分只包含第一个元素,未排序部分包含其余元素。然后,从未排序部分中依次取出一个元素,在已排序部分中找到其合适的插入位置,并将该元素插入到该位置。重复此过程,直到所有元素都被插入到已排序部分。### 2. 算法步骤1.
初始化:
将第一个元素视为已排序序列。 2.
迭代:
从第二个元素开始,依次遍历未排序部分的每个元素。 3.
比较:
将当前元素与已排序序列中的元素进行比较。 4.
移动:
如果当前元素小于已排序序列中的某个元素,则将该元素及其后面的元素后移一个位置,为当前元素腾出空间。 5.
插入:
将当前元素插入到合适的位置。 6.
重复:
重复步骤 2-5,直到所有元素都被插入到已排序序列中。### 3. 例子假设待排序的序列为:`[5, 2, 4, 6, 1, 3]`1.
初始状态:
已排序序列:[5],未排序序列:[2, 4, 6, 1, 3]2.
处理2:
2 < 5,将 5 后移,然后将 2 插入到 5 之前。已排序序列:[2, 5],未排序序列:[4, 6, 1, 3]3.
处理4:
4 > 2, 4 < 5,将 4 插入到 2 和 5 之间。已排序序列:[2, 4, 5],未排序序列:[6, 1, 3]4.
处理6:
6 > 5,6 直接插入到最后。已排序序列:[2, 4, 5, 6],未排序序列:[1, 3]5.
处理1:
1 < 2, 1 < 4, 1 < 5, 1 < 6,将 1 插入到最前面。已排序序列:[1, 2, 4, 5, 6],未排序序列:[3]6.
处理3:
3 > 1, 3 < 2 (false), 3 > 2, 3 < 4,将 3 插入到 2 和 4 之间。已排序序列:[1, 2, 3, 4, 5, 6],未排序序列:[]最终排序结果为:[1, 2, 3, 4, 5, 6]## 代码实现 (Python)```python def insertion_sort(arr):"""直接插入排序算法实现。Args:arr: 待排序的列表。Returns:排序后的列表。"""for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keyreturn arr# 示例 arr = [5, 2, 4, 6, 1, 3] sorted_arr = insertion_sort(arr) print(f"排序后的数组: {sorted_arr}") ```## 时间复杂度和空间复杂度
时间复杂度:
最佳情况 O(n) (数据已排序),平均情况 O(n²),最坏情况 O(n²) (数据逆序)。
空间复杂度:
O(1) (原地排序,只使用了常数个额外空间)。## 适用场景直接插入排序适合以下场景:
数据量较小 (n ≤ 50)。
数据基本有序 (接近有序的数据,插入排序效率较高)。
稳定性要求 (直接插入排序是一种稳定的排序算法)。## 总结直接插入排序算法简单易懂,实现容易,适合用于小规模数据的排序或基本有序数据的排序。 然而,对于大规模数据,其效率较低,建议选择更高级的排序算法,例如归并排序或快速排序。
直接插入排序法
简介直接插入排序 (Insertion Sort) 是一种简单直观的排序算法。它的工作原理类似于我们整理扑克牌的过程:从第二张牌开始,依次将每张牌插入到前面已排序好的牌序列中正确的位置。 它是一种原地排序算法,空间复杂度较低,但时间复杂度相对较高,因此更适合小规模数据的排序。
算法流程
1. 基本思想直接插入排序的基本思想是将待排序的序列分成已排序部分和未排序部分两部分。初始时,已排序部分只包含第一个元素,未排序部分包含其余元素。然后,从未排序部分中依次取出一个元素,在已排序部分中找到其合适的插入位置,并将该元素插入到该位置。重复此过程,直到所有元素都被插入到已排序部分。
2. 算法步骤1. **初始化:** 将第一个元素视为已排序序列。 2. **迭代:** 从第二个元素开始,依次遍历未排序部分的每个元素。 3. **比较:** 将当前元素与已排序序列中的元素进行比较。 4. **移动:** 如果当前元素小于已排序序列中的某个元素,则将该元素及其后面的元素后移一个位置,为当前元素腾出空间。 5. **插入:** 将当前元素插入到合适的位置。 6. **重复:** 重复步骤 2-5,直到所有元素都被插入到已排序序列中。
3. 例子假设待排序的序列为:`[5, 2, 4, 6, 1, 3]`1. **初始状态:** 已排序序列:[5],未排序序列:[2, 4, 6, 1, 3]2. **处理2:** 2 < 5,将 5 后移,然后将 2 插入到 5 之前。已排序序列:[2, 5],未排序序列:[4, 6, 1, 3]3. **处理4:** 4 > 2, 4 < 5,将 4 插入到 2 和 5 之间。已排序序列:[2, 4, 5],未排序序列:[6, 1, 3]4. **处理6:** 6 > 5,6 直接插入到最后。已排序序列:[2, 4, 5, 6],未排序序列:[1, 3]5. **处理1:** 1 < 2, 1 < 4, 1 < 5, 1 < 6,将 1 插入到最前面。已排序序列:[1, 2, 4, 5, 6],未排序序列:[3]6. **处理3:** 3 > 1, 3 < 2 (false), 3 > 2, 3 < 4,将 3 插入到 2 和 4 之间。已排序序列:[1, 2, 3, 4, 5, 6],未排序序列:[]最终排序结果为:[1, 2, 3, 4, 5, 6]
代码实现 (Python)```python def insertion_sort(arr):"""直接插入排序算法实现。Args:arr: 待排序的列表。Returns:排序后的列表。"""for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keyreturn arr
示例 arr = [5, 2, 4, 6, 1, 3] sorted_arr = insertion_sort(arr) print(f"排序后的数组: {sorted_arr}") ```
时间复杂度和空间复杂度* **时间复杂度:** 最佳情况 O(n) (数据已排序),平均情况 O(n²),最坏情况 O(n²) (数据逆序)。 * **空间复杂度:** O(1) (原地排序,只使用了常数个额外空间)。
适用场景直接插入排序适合以下场景:* 数据量较小 (n ≤ 50)。 * 数据基本有序 (接近有序的数据,插入排序效率较高)。 * 稳定性要求 (直接插入排序是一种稳定的排序算法)。
总结直接插入排序算法简单易懂,实现容易,适合用于小规模数据的排序或基本有序数据的排序。 然而,对于大规模数据,其效率较低,建议选择更高级的排序算法,例如归并排序或快速排序。