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

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

相关推荐
测开小菜鸟2 分钟前
使用python向钉钉群聊发送消息
java·python·钉钉
好奇龙猫32 分钟前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
P.H. Infinity1 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天1 小时前
java的threadlocal为何内存泄漏
java
sp_fyf_20241 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
caridle1 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^1 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋31 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
秋の花1 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
香菜大丸1 小时前
链表的归并排序
数据结构·算法·链表