java算法系列,第三篇:插入排序

  还是一如往常从较为便于理解的递归方式入手:

 @Test
    @DisplayName("插入排序(递归)")
    public void test4() {
        int[] arr = {6,1, 3, 2, 5, 4};
        sort(arr);
        //遍历打印
        for (int i : arr) {
            System.out.println(i);
        }
    }
    public void sort(int[] arr) {
        insrtion(arr, 1);
    }

    private void insrtion(int[] arr, int i) {
        if(i == arr.length){//如果i=arr.length,说明已经排好序了
            return;
        }
        int temp= arr[i];//记录当前要比较的数
        int j= i -1;//记录当前要比较的数的前一个数的下标
        while(j>=0&&temp< arr[j]){//如果当前要比较的数比前一个数小,就交换
            arr[j+1]= arr[j];//把前一个数往后移
            j--;//继续往前比较
        }
        arr[j+1]=temp;//把当前要比较的数放到合适的位置
        insrtion(arr, i +1);//继续下一个数的比较
    }

逻辑分析:

  1. insrtion(int[] arr, int i)方法:

    • insrtion方法用于对传入的整数数组arr进行插入排序。
    • 参数i表示当前要比较的数的下标,初始值为0,即从数组的第一个元素开始比较。
    • 在每次递归调用时,我们假设从索引0到索引i-1的元素已经排好序,而要将第i个元素插入到正确的位置。
  2. 内部逻辑:

    • 在每次递归开始时,记录当前要比较的数temparr[i]
    • 使用变量j初始化为i - 1,表示当前要比较的数的前一个数的下标。
    • while循环中,比较temparr[j]的大小,如果temparr[j]小,则将arr[j]往后移动一位,继续比较前一个元素,直到找到temp应该插入的合适位置。在找到合适位置后,temp的值被插入到arr[j + 1]中。
    • 接着递归调用insrtion(arr, i + 1),继续下一个数的比较,直到i等于数组的长度arr.length,即整个数组排序完成。

非递归:

 int[] arr = {1, 3, 2, 5, 4};
        for(int i=1;i<arr.length;i++){//从第二个数开始比较
            int temp=arr[i];//记录当前要比较的数
            int j=i-1;//记录当前要比较的数的前一个数的下标
            while(j>=0&&temp<arr[j]){//如果当前要比较的数比前一个数小,就交换
                arr[j+1]=arr[j];//把前一个数往后移
                j--;//继续往前比较
            }
            arr[j+1]=temp;//把当前要比较的数放到合适的位置
        }
        //遍历打印
        for (int i : arr) {
            System.out.println(i);
        }

逻辑分析:

  1. for循环 for (int i = 1; i < arr.length; i++) 用于遍历整个数组,从第二个元素(索引为1)开始,因为一个元素的数组可以认为是已排序的。

  2. 在每次循环中,记录当前要比较的数为temp,即int temp = arr[i]

  3. 使用变量j初始化为i - 1,表示当前要比较的数的前一个数的下标。

  4. while循环中,比较temparr[j]的大小,如果temparr[j]小,则将arr[j]往后移动一位,并将j向前移动一位,继续比较前一个元素,直到找到temp应该插入的合适位置。

  5. 在找到合适位置后,将temp的值插入到arr[j + 1]中,即arr[j + 1] = temp

  6. 循环结束后,整个数组将被排序完成。

  7. 最后,使用增强型for循环遍历打印排序后的数组元素。

插入排序算法是一种简单但效率较低的排序算法,在数据量较大的情况下性能可能较差。对于大规模数据的排序,推荐使用更高效的排序算法,如快速排序或归并排序。但对于小规模数据,插入排序在代码实现上较为简单,可以满足需求。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值