十大排序算法之——插入排序算法(Java实现)及思路讲解

插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

下面是一个使用Java实现的插入排序的示例,同时我会尽量详细解释每一步操作,以便达到1500字的要求。

java 复制代码
public class InsertionSort {
    public static void main(String[] args) {
        int[] array = {4, 3, 2, 10, 12, 1, 5, 6};
        System.out.println("原始数组:");
        printArray(array);
        
        insertionSort(array);
        
        System.out.println("排序后的数组:");
        printArray(array);
    }

    public static void insertionSort(int[] array) {
        int n = array.length;
        for (int i = 1; i < n; ++i) {
            int key = array[i];
            int j = i - 1;

            /* 将大于key的元素后移 */
            while (j >= 0 && array[j] > key) {
                array[j + 1] = array[j];
                j = j - 1;
            }
            array[j + 1] = key;
        }
    }

    // 用于打印数组的辅助函数
    public static void printArray(int arr[]) {
        int n = arr.length;
        for (int i = 0; i < n; ++i) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

现在,我们逐行解释这个代码:

  1. 我们首先定义了一个InsertionSort类,并在其中包含了main方法,这是Java程序的入口点。

2-4. 在main方法中,我们定义了一个待排序的整数数组array,并调用printArray方法打印出原始数组。

  1. 我们定义了insertionSort方法,它接受一个整数数组作为参数,并对其进行排序。

  2. insertionSort方法中,我们首先获取数组的长度n

8-16. 接下来是一个从1到n-1的循环。这个循环用于遍历数组中的每个元素,除了第一个元素(因为它默认已经是排序好的)。

  1. 我们取出当前要插入的元素key,它等于当前索引i处的数组值。

  2. 我们初始化一个变量j,它表示当前已排序部分的最后一个元素的索引。

11-14. 这是一个while循环,用于将所有大于key的元素向后移动一个位置。这样,我们就为key在已排序部分中找到了一个合适的位置。循环的条件是j大于等于0,并且array[j]大于key。如果这两个条件都满足,我们就将array[j]的值赋给array[j+1],并将j减1。这个操作将大于key的元素向后移动一个位置。

  1. 最后,我们将key插入到已排序部分的正确位置,即array[j+1]

17-21. 在main方法的最后,我们调用insertionSort方法对数组进行排序,并再次调用printArray方法打印出排序后的数组。

这个插入排序的实现是非常基础的,但它很好地展示了插入排序的基本思想。每次迭代,它都会将一个元素插入到已排序部分的正确位置。虽然插入排序在处理大型数据集时可能不是最高效的算法,但对于小型数据集或部分有序的数据集,它的性能是可以接受的。

插入排序的时间复杂度在最坏和平均情况下是O(n^2),其中n是数组的长度。然而,在最好的情况下(即数组已经排序),它的时间复杂度是O(n)。这是因为在这种情况下,每次迭代都不需要移动任何元素。

总的来说,插入排序是一种简单且易于理解的排序算法,它对于学习排序算法的基本概念非常有用。

相关推荐
BothSavage3 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn3 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
人活一口气3 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
烬羽5 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
NE_STOP5 小时前
Vibe Coding -- 完整项目案例实操
java
荣码5 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing5 小时前
Google第三方授权登录
java·后端·程序员
明月光8185 小时前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
考虑考虑15 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯15 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式