微信登录

插入排序 - 算法实现 - 插入排序的代码实现

插入排序 - 算法实现 - 插入排序的代码实现

一、引言

在计算机科学的世界里,排序算法就像是一把神奇的钥匙,能够将杂乱无章的数据变得井然有序。插入排序(Insertion Sort)作为一种简单直观的排序算法,虽然在处理大规模数据时效率可能不如一些高级算法,但它的思想简洁易懂,实现起来也相对容易,在很多特定场景下有着独特的优势。本文将深入探讨插入排序的原理、实现步骤,并给出具体的代码实现。

二、插入排序的原理

插入排序的基本思想是将一个数据插入到已经排好序的序列中的适当位置,使得插入后这个序列仍然有序。可以类比我们平时玩扑克牌的场景,当我们从牌堆中一张张抽取扑克牌时,会将每一张新抽到的牌插入到手中已经排好序的牌的合适位置,最终使得手中的牌按顺序排列。

三、插入排序的实现步骤

假设我们有一个包含 $n$ 个元素的数组 $arr$,要对其进行升序排序,插入排序的具体步骤如下:

  1. 将第一个元素视为已排序序列:初始时,我们认为数组的第一个元素已经是一个有序序列,因为只有一个元素时它自然是有序的。
  2. 遍历未排序元素:从第二个元素开始,依次将每个元素插入到前面已经排好序的序列中。
  3. 插入元素:对于当前要插入的元素,将其与前面已排序序列中的元素从后往前依次比较,如果当前元素小于比较的元素,则将比较的元素向后移动一位,直到找到一个合适的位置插入当前元素。

下面通过一个具体的例子来演示插入排序的过程。假设我们有一个数组 [5, 3, 4, 1, 2],对其进行插入排序的详细步骤如下:

步骤 已排序序列 未排序序列 操作
初始 [5] [3, 4, 1, 2] 第一个元素 5 视为已排序
1 [3, 5] [4, 1, 2] 将 3 插入到 [5] 中,3 < 5,5 后移,3 插入到 5 前面
2 [3, 4, 5] [1, 2] 将 4 插入到 [3, 5] 中,4 < 5,5 后移,4 插入到 5 前面
3 [1, 3, 4, 5] [2] 将 1 插入到 [3, 4, 5] 中,1 小于所有已排序元素,所有元素后移,1 插入到最前面
4 [1, 2, 3, 4, 5] [] 将 2 插入到 [1, 3, 4, 5] 中,2 < 3,3、4、5 后移,2 插入到 1 后面

四、插入排序的代码实现

Python 代码实现

  1. def insertion_sort(arr):
  2. # 从第二个元素开始遍历数组
  3. for i in range(1, len(arr)):
  4. # 当前要插入的元素
  5. key = arr[i]
  6. # 已排序序列的最后一个元素的索引
  7. j = i - 1
  8. # 将比 key 大的元素向后移动
  9. while j >= 0 and key < arr[j]:
  10. arr[j + 1] = arr[j]
  11. j -= 1
  12. # 插入 key
  13. arr[j + 1] = key
  14. return arr
  15. # 测试代码
  16. arr = [5, 3, 4, 1, 2]
  17. sorted_arr = insertion_sort(arr)
  18. print("排序后的数组:", sorted_arr)

Java 代码实现

  1. public class InsertionSort {
  2. public static void insertionSort(int[] arr) {
  3. int n = arr.length;
  4. // 从第二个元素开始遍历数组
  5. for (int i = 1; i < n; i++) {
  6. // 当前要插入的元素
  7. int key = arr[i];
  8. // 已排序序列的最后一个元素的索引
  9. int j = i - 1;
  10. // 将比 key 大的元素向后移动
  11. while (j >= 0 && key < arr[j]) {
  12. arr[j + 1] = arr[j];
  13. j--;
  14. }
  15. // 插入 key
  16. arr[j + 1] = key;
  17. }
  18. }
  19. public static void main(String[] args) {
  20. int[] arr = {5, 3, 4, 1, 2};
  21. insertionSort(arr);
  22. System.out.print("排序后的数组: ");
  23. for (int num : arr) {
  24. System.out.print(num + " ");
  25. }
  26. }
  27. }

五、复杂度分析

  • 时间复杂度:插入排序的平均时间复杂度和最坏时间复杂度都是 $O(n^2)$,其中 $n$ 是数组的长度。在最好情况下,即数组已经是有序的,插入排序只需要遍历一次数组,时间复杂度为 $O(n)$。
  • 空间复杂度:插入排序只需要常数级的额外空间,空间复杂度为 $O(1)$。

六、总结

插入排序是一种简单易懂的排序算法,它的实现思路清晰,代码实现也相对简单。虽然它的时间复杂度在大规模数据下不是最优的,但在处理小规模数据或者数据基本有序的情况下,插入排序的性能还是比较不错的。通过本文的介绍,相信你已经对插入排序的原理和代码实现有了更深入的理解,可以尝试在实际编程中运用插入排序来解决相关问题。

插入排序 - 算法实现 - 插入排序的代码实现