十大排序算法之——插入排序算法(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)。这是因为在这种情况下,每次迭代都不需要移动任何元素。

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

相关推荐
战族狼魂8 小时前
高频面试题精选:分治与AI Agent架构
人工智能·算法·大模型·大语言模型
weixin_408099678 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
李剑一8 小时前
你用过网易的将军令嘛?它底层实现账号保护的原理相当简单粗暴
算法
Scott9999HH8 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
钱六两8 小时前
#3、SpringAI 接入deepSeek大模型(喂饭版)
java·spring boot·ai编程
香辣牛肉饭9 小时前
【算法】动态规划 最长公共子序列(LCS)
经验分享·笔记·算法·动态规划
null_1710 小时前
IntelliJ IDEA 极致流畅配置方案:Ultra 9 285K + 64GB 内存实测
java·ide·intellij-idea
Herbert_hwt10 小时前
建立Java程序开发
java·开发语言
好好沉淀10 小时前
@ExcelIgnoreUnannotated 和 @AutoMapper 详解
java