Java实现插入排序及详解

本文深入解析了插入排序算法,包括其工作原理、实现步骤及代码示例。插入排序是一种直观的排序方法,通过模拟手动排序扑克牌的过程,将数组分为已排序部分和未排序部分,逐步将未排序的元素插入到已排序的部分中。文章还提供了详细的Java实现代码,并讨论了算法的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插入排序

概述

插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。

插入排序就像排序一手扑克牌。开始时,我们的左手为空 并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的。
在这里插入图片描述
图源百度百科

实现原理

将一个数组看成两段,前段为排序好的,后段为待排序的数字,将待排序的数字从第一个依次和前段的数字比,插入到合适的位置即完成排序。

首先,在前后分隔线两端(即前段最后一个,和后端第一个)的数字比较,如果后一个小于前一个即交换两者的位置,直到前一个小于后一个停止,即完成插入。

然后,就相当于前段的数字多了一个,而后段的数字少了一个,即前后分隔线后移了一个位置,继续上面的比较过程即可。

实现代码

package sort;

public class InsertSort {
    public static void main(String[] args) {

        int[] array = new int[80000];
        for (int i = 0; i < array.length; i++) {
            array[i] = (int)(Math.random()*800000);
        }
        long startTime=System.currentTimeMillis();
        insertSort(array);
        long endTime=System.currentTimeMillis();
        System.out.println("程序运行时间: "+(endTime - startTime)+"ms");
        //这里排序长度80k的数组,我的老机器的用时为两秒多,说明性能强于冒泡排序和选择排序
    }

    public static int[] insertSort(int[] array){
        //i为需要和前面排列好的数字比较的数字的下标,i从1开始,
        // 因为第0个数字是不需要排列的,我们视为它是排列好的
        //之后每次加1,都是将其和前面排好的每个数字比较,如果比它小 就插入到它前面。
        for (int i = 1; i < array.length; i++) {
            //这里从i开始,当前一个数字大于后一个时,交换两者的位置,
            //循环,直到前一个数字没有大于后一个数字或者到达数组最前端,
            //这样即可实现 插入到 排列好的数字 小于 该数字 的后面 的位置
            for (int j = i; j > 0 && array[j] < array[j-1]; j--) {
                int n = array[j];
                array[j] = array[j-1];
                array[j-1] = n;
            }
        }
        return array;
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值