直接插入排序算法

文章目录

  • 前言
  • 1、算法原理
  • 2、算法实现
    • 2.1直接插入排序算法的具体步骤如下:
      • 2.1.1、分组
      • 2.1.2、插入
      • 2.1.3、重复步骤2
    • 2.2代码实现
      • insertionSort
      • main函数
      • 运行结果:
      • 2.2.1、int n = arr.length:获取待排序数组的长度;
      • 2.2.2、for (int i = 1; i < n; i++):外层循环从第二个元素开始遍历到最后一个元素;
      • 2.2.3、int key = arr[i]:记录当前需要插入的元素;
      • 2.2.4、int j = i - 1:定义指针j,用于遍历已排序的元素;
      • 2.2.5、while (j >= 0 && arr[j] > key):内层循环遍历已排序的元素,直到找到需要插入的位置;
      • 2.2.6、arr[j + 1] = arr[j]:将当前元素向右移
      • 2.2.7、j--:继续向左遍历已排序部分;
      • 2.2.8、arr[j + 1] = key:将需要插入的元素插入到正确的位置上。
    • 2.3、解释
  • 3、时间复杂度分析
    • 3.1比较
  • 4、空间复杂度分析
    • 4.1比较
  • 总结

前言

直接插入排序是一种基于比较的排序算法,它是一种简单但是效率较低的排序算法,通常用于对小规模数据进行排序。在本篇博客中,我们将深入探讨直接插入排序算法的原理、实现以及时间复杂度等方面的内容。

1、算法原理

直接插入排序是一种稳定的排序算法,它的基本思想是:将一个待排序的序列分成有序和无序两个部分,依次将无序部分的元素插入到有序部分的合适位置,直到整个序列有序为止。

具体来说,我们将序列的第一个元素看作是已排序的部分,然后从第二个元素开始,将它与已排序的部分中的元素逐一比较,找到它应该插入的位置,并将其插入到该位置。之后,再将第三个元素与已排序的部分中的元素逐一比较,找到它应该插入的位置,并将其插入到该位置,以此类推,直到将整个序列中的元素都插入到已排序的部分中。

2、算法实现

2.1直接插入排序算法的具体步骤如下:

2.1.1、分组

将待排序数组划分为已排序和未排序两部分,初始时已排序部分只有一个元素,即待排序数组的第一个元素;

2.1.2、插入

从未排序部分取出一个元素,插入到已排序部分的合适位置,使得已排序部分仍然有序;

2.1.3、重复步骤2

直到未排序部分中的所有元素都被插入到已排序部分中。

2.2代码实现

首先,我们定义一个名为insertionSort的函数,该函数接收一个整数数组作为参数,用于对该数组进行排序。

insertionSort

public static void insertionSort(int[] arr) {
    int n = arr.length; // 获取待排序数组的长度
    for (int i = 1; i < n; i++) { // 外层循环从第二个元素开始遍历到最后一个元素
        int key = arr[i]; // 记录当前需要插入的元素
        int j = i - 1; // 定义指针j,用于遍历已排序的元素
        while (j >= 0 && arr[j] > key) { // 内层循环遍历已排序的元素,直到找到需要插入的位置
            arr[j + 1] = arr[j]; // 将当前元素向右移动一位
            j--; // 指针j向前移动一位
        }
        arr[j + 1] = key; // 将需要插入的元素插入到合适的位置
        System.out.println("第" + i + "轮:" + Arrays.toString(arr));
    }
}

main函数

public static void main(String[] args) {
    int[] arr = { 5, 2, 4, 6, 1, 3 };
    System.out.println("排序前:" + Arrays.toString(arr));
    insertionSort(arr);
    System.out.println("排序后:" + Arrays.toString(arr));
}

运行结果:

排序前:[5, 2, 4, 6, 1, 3]
第1轮:[2, 5, 4, 6, 1, 3]
第2轮:[2, 4, 5, 6, 1, 3]
第3轮:[2, 4, 5, 6, 1, 3]
第4轮:[1, 2, 4, 5, 6, 3]
第5轮:[1, 2, 3, 4, 5, 6]
排序后:[1, 2, 3, 4, 5, 6]

2.2.1、int n = arr.length:获取待排序数组的长度;

2.2.2、for (int i = 1; i < n; i++):外层循环从第二个元素开始遍历到最后一个元素;

2.2.3、int key = arr[i]:记录当前需要插入的元素;

2.2.4、int j = i - 1:定义指针j,用于遍历已排序的元素;

2.2.5、while (j >= 0 && arr[j] > key):内层循环遍历已排序的元素,直到找到需要插入的位置;

2.2.6、arr[j + 1] = arr[j]:将当前元素向右移

2.2.7、j–:继续向左遍历已排序部分;

2.2.8、arr[j + 1] = key:将需要插入的元素插入到正确的位置上。

2.3、解释

该实现中,我们使用了两个循环来遍历数组,其中外层循环遍历待排序数组中的每个元素,而内层循环则遍历已排序部分中的元素,以寻找需要插入的位置。

需要注意的是,在内层循环中,当已排序部分中的元素大于当前需要插入的元素时,我们需要将已排序部分中的元素向右移动一位,以便为当前元素腾出插入的空间。

最后,我们将当前元素插入到正确的位置上,完成一次插入操作。当外层循环结束后,整个数组就被排好序了。

3、时间复杂度分析

直接插入排序算法的空间复杂度是O(1),也就是说,该算法的排序过程中不需要使用额外的存储空间,只需要利用原数组本身的空间就可以完成排序。

具体来说,在插入排序算法的过程中,只需要定义常量级别的临时变量,用于存储需要插入的元素以及进行交换操作时需要临时存储的变量。因此,插入排序算法的空间复杂度与待排序数组的长度无关。

3.1比较

相比较于一些需要额外开辟内存空间的排序算法,如归并排序、堆排序等,直接插入排序算法的空间复杂度较低,适用于对内存空间有限的场景。

总之,直接插入排序算法具有空间复杂度低、实现简单等特点,对于对空间要求较高的场景,可以优先选择该算法。

4、空间复杂度分析

直接插入排序算法的空间复杂度是O(1),也就是说,该算法的排序过程中不需要使用额外的存储空间,只需要利用原数组本身的空间就可以完成排序。

具体来说,在插入排序算法的过程中,只需要定义常量级别的临时变量,用于存储需要插入的元素以及进行交换操作时需要临时存储的变量。因此,插入排序算法的空间复杂度与待排序数组的长度无关。

4.1比较

相比较于一些需要额外开辟内存空间的排序算法,如归并排序、堆排序等,直接插入排序算法的空间复杂度较低,适用于对内存空间有限的场景。

总结

直接插入排序算法是一种简单但是效率较低的排序算法,适用于对小规模数据进行排序。它的基本思想是将一个待排序的序列分成有序和无序两个部分,依次将无序部分的元素插入到有序部分的合适位置,直到整个序列有序为止。

直接插入排序算法的时间复杂度为O(n^2),其中n表示待排序数组的长度。在实际使用中,直接插入排序算法通常只用于对小规模数据进行排序,对于大规模数据的排序,需要选择更加高效的算法。

总之,直接插入排序算法是一种简单而有效的排序算法,适用于小规模数据的排序或作为快速排序等高级排序算法的优化手段。但是,由于其时间复杂度较高,不适用于大规模数据的排序。

你可能感兴趣的:(数据结构+算法,排序算法,算法,数据结构)