Java实现插入排序及其优化 insertion sort

本文带来八大排序算法之插入排序。

插入排序(Insertion Sort)属于内部排序算法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。

插入排序基本思想:

把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出一个元素,把它的排序码依次与有序元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

推导过程(以数组 arr = {101, 34, 119, 1}为例):

        //逐步推导,方便理解
        //第1轮{101, 34, 119, 1} ==> {34, 101, 119, 1}

        int insertValue = arr[1]; //根据插入排序定义,从第二个数开始找位置
        int insertIndex = 1 - 1; //表示待排序数前面的那个索引,即arr[1]前面数的下标

        while(insertIndex >=0 && insertValue < arr[insertIndex]){
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex--;
        }

        //
        arr[insertIndex + 1] = insertValue; //当退出while 循环时,说明找到插入的位置了,即 insertIndex + 1 //此时isertIndex 为-1 故要 先 + 1

        System.out.println("第1轮排序后的顺序时:" + Arrays.toString(arr));

        //第2轮
        insertValue = arr[2]; //根据插入排序定义,从第3个数开始找位置
        insertIndex = 2 - 1; 

        while(insertIndex >=0 && insertValue < arr[insertIndex]){
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex--;
        }

        //
        arr[insertIndex + 1] = insertValue; //当退出while 循环时,说明找到插入的位置了,即 insertIndex + 1

        System.out.println("第2轮排序后的顺序时:" + Arrays.toString(arr));

        //第3轮
        insertValue = arr[3]; //根据插入排序定义,从第3个数开始找位置
        insertIndex = 3 - 1; 

        while(insertIndex >=0 && insertValue < arr[insertIndex]){
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex--;
        }

        //
        arr[insertIndex + 1] = insertValue; //当退出while 循环时,说明找到插入的位置了,即 insertIndex + 1

        System.out.println("第3轮排序后的顺序时:" + Arrays.toString(arr));

代码实现:

import java.util.Arrays;

public class InsertSort {

    
    public static void main(String[] args){

        int[] arr = {101, 34, 119, 1};
        insertSort(arr);

    }

    //插入排序 insection sort
    public static void insertSort(int[] arr){

        int insertValue = 0;
        int insertIndex = 0;

        for(int i=1; i<arr.length; i++){
            insertValue = arr[i]; //表示待插入的数,根据插入排序定义,从第二个数开始找位置 
            insertIndex = i - 1; //表示待排序数前面的那个索引,即arr[1]前面数的下标
    
            //给insertValue 找到插入的位置
            //说明:
            //1. insertValue >= 0 保证在给insertValue 找插入位置时,数组不越界
            //2. insertValue < arr[insertIndex] 表示 待插入的数 还没有找到插入位置
            //3. 找到位置后,需要将arr[insertIndex]后移动
            while(insertIndex >=0 && insertValue < arr[insertIndex]){
                arr[insertIndex + 1] = arr[insertIndex];
                insertIndex--;
            }
    
            //优化--判断是否需要赋值
            if(insertIndex + 1 != i){
                arr[insertIndex + 1] = insertValue; //当退出while 循环时,说明找到插入的位置了,即 insertIndex + 1
            }
    
            System.out.println("第"+i+"轮排序后的顺序时:" + Arrays.toString(arr));

        }

    }
    
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值