排序算法-插入排序

插入排序

什么是插入排序

插入排序(Insertion sort),也被称为直接插入排序。

对少量的元素进行排序,效果很显著。

生活中,玩扑克牌就是利用了插入排序。拿到一张牌后,插入到手里的有序排列中,直到将牌拿完并排序结束
在这里插入图片描述

数组也是一样,要排序的元素按照大小依次插入到已经排好的有序数组中,直到排完为止

原理

  • 插入排序的基本思想是将待排序的数组分成两部分,已排序的和未排序的。

  • 每次从未排序的部分中取出第一个元素,将它插入到已排序的部分中的合适位置。插入时,从已排序的部分的最后一个元素开始比较,如果比它大,则将它后移一位,直到找到合适的位置。具体实现是通过嵌套两个循环,外层循环控制待排序的元素,内层循环控制已排序的元素。在内层循环中,如果当前元素比前一个元素小,则将前一个元素后移一位,直到找到合适的位置,然后将当前元素插入到该位置。

升序插入排列

 @Test
    public void testInsertAscengSort() {
        int[] a = {5, 3, 8, 1, 9, 23, 11, 6};
        int aLength = a.length;
        System.out.println("排序前"+Arrays.toString(a));
        //第一轮排序
        for (int i = 1; i < aLength; i++) {
            //将当前元素赋值给变量
            int insertData = a[i];
            while (i > 0) {
                //两个相邻的元素做比较
                if (a[i - 1] > insertData) {
                    //将大的值往后一个位置移
                    a[i] = a[i - 1];
                } else if (a[i - 1] < insertData) { // 如果小于insertData,插入位置

                    a[i] = insertData;
                    break;
                }
                /**
                 * 索引递减
                 * while循环反复进行元素比较
                 */
                i--;
            }
            //如果是第一个位置就将其插入
            if (i == 0) {
                a[0] = insertData;
            }
        }
        System.out.println(Arrays.toString(a));
    }

测试结果

在这里插入图片描述

方式2

@Test
public void test() {
    int[] a = {5, 3, 8, 1, 9, 23, 11, 6};
    // 从第二个元素开始,依次将买个元素插入到前面已排序的序列中
    for (int i = 1; i < a.length; i++) {
        int j = i;
        int temp = a[j];
        //while循环检测当前元素temp是否小于其左侧的元素a[j - 1]
        while (j > 0 && a[j - 1] > temp){
            //调换位置
            a[j] = a[j - 1];
            /**
             * 用于每次while循环迭代后将j的值减1(必须)
             * 因为while循环用于向右侧移动元素,直到找到当前元素的正确位置,通过减小j,
             * 确保当前元素被插入到已排序的字数组中的正确位置
             */
            j--;
        }
        a[j] = temp;
    }
    System.out.println(Arrays.toString(a));

}

在这里插入图片描述

降序插入排序

@Test
public void testInsertAscengSort() {
    int[] a = {5, 3, 8, 1, 9, 23, 11, 6};
    int aLength = a.length;
    System.out.println("排序前"+Arrays.toString(a));
    //第一轮排序
    for (int i = 1; i < aLength; i++) {
        //将当前元素赋值给变量
        int insertData = a[i];
        while (i > 0) {
            //两个相邻的元素做比较
            if (a[i - 1] < insertData) {
                //将小的值往后一个位置移
                a[i] = a[i - 1];
            } else if (a[i - 1] > insertData) { // 如果大于insertData,插入位置

                a[i] = insertData;
                break;
            }
            /**
             * 索引递减
             * while循环反复进行元素比较
             */
            i--;
        }
        //如果是第一个位置就将其插入
        if (i == 0) {
            a[0] = insertData;
        }
    }
    System.out.println("排序后"+Arrays.toString(a));
}

测试结果

在这里插入图片描述

插入排序工具类

package com.sin.demo.utli;


/**
 * @author sin
 * @date 2022/11/1
 * @apiNote
 */
public class InsertSortUtils {

    /**
     * 升序排序
     *
     * @param array
     * @return
     */
    public byte[] ascengSort(byte[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            byte insertData = array[i];
            while (i > 0) {
                if (array[i - 1] > insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] < insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
    /**
     * 升序排序
     *
     * @param array
     * @return
     */
    public short[] ascengSort(short[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            short insertData = array[i];
            while (i > 0) {
                if (array[i - 1] > insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] < insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
    /**
     * 升序排序
     *
     * @param array
     * @return
     */
    public int[] ascengSort(int[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            int insertData = array[i];
            while (i > 0) {
                if (array[i - 1] > insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] < insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
    /**
     * 升序排序
     *
     * @param array
     * @return
     */
    public long[] ascengSort(long[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            long insertData = array[i];
            while (i > 0) {
                if (array[i - 1] > insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] < insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
    /**
     * 升序排序
     *
     * @param array
     * @return
     */
    public float[] ascengSort(float[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            float insertData = array[i];
            while (i > 0) {
                if (array[i - 1] > insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] < insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
    /**
     * 升序排序
     *
     * @param array
     * @return
     */
    public double[] ascengSort(double[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            double insertData = array[i];
            while (i > 0) {
                if (array[i - 1] > insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] < insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
    /**
     * 升序排序
     *
     * @param array
     * @return
     */
    public char[] ascengSort(char[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            char insertData = array[i];
            while (i > 0) {
                if (array[i - 1] > insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] < insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }

    /**
     * 降序排序
     *
     * @param array
     * @return
     */
    public byte[] dropSort(byte[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            byte insertData = array[i];
            while (i > 0) {
                if (array[i - 1] < insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] > insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
    /**
     * 降序排序
     *
     * @param array
     * @return
     */
    public short[] dropSort(short[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            short insertData = array[i];
            while (i > 0) {
                if (array[i - 1] < insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] > insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
    /**
     * 降序排序
     *
     * @param array
     * @return
     */
    public int[] dropSort(int[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            int insertData = array[i];
            while (i > 0) {
                if (array[i - 1] < insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] > insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
    /**
     * 降序排序
     *
     * @param array
     * @return
     */
    public long[] dropSort(long[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            long insertData = array[i];
            while (i > 0) {
                if (array[i - 1] < insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] > insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
    /**
     * 降序排序
     *
     * @param array
     * @return
     */
    public float[] dropSort(float[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            float insertData = array[i];
            while (i > 0) {
                if (array[i - 1] < insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] > insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
    /**
     * 降序排序
     *
     * @param array
     * @return
     */
    public double[] dropSort(double[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            double insertData = array[i];
            while (i > 0) {
                if (array[i - 1] < insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] > insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
    /**
     * 降序排序
     *
     * @param array
     * @return
     */
    public char[] dropSort(char[] array) {
        int arrayLength = array.length;

        for (int i = 1; i < arrayLength; i++) {
            char insertData = array[i];
            while (i > 0) {
                if (array[i - 1] < insertData) {
                    array[i] = array[i - 1];
                } else if (array[i - 1] > insertData) {
                    array[i] = insertData;
                    break;
                }
                i--;
            }
            if (i == 0) {
                array[0] = insertData;
            }
        }
        return array;
    }
}
//实例化
InsertSortUtils insertSort = new InsertSortUtils();

int类型升序测试

@Test
public void testInsertSort() {
    int[] a = {5, 3, 8, 1, 9, 23, 11, 6};
    System.out.println("排序前" + Arrays.toString(a));
    insertSort.ascengSort(a);
    System.out.println("排序后" + Arrays.toString(a));
}
测试结果

在这里插入图片描述

int类型降序测试

@Test
public void testInsertSort() {
    int[] a = {5, 3, 8, 1, 9, 23, 11, 6};
    System.out.println("排序前" + Arrays.toString(a));
    insertSort.dropSort(a);
    System.out.println("排序后" + Arrays.toString(a));
}
测试结果

在这里插入图片描述

char类型升序测试

@Test
public void testInsertSort() {
    char[] a = {'a','c','b','v','z','e','d'};
    System.out.println("排序前" + Arrays.toString(a));
    insertSort.ascengSort(a);
    System.out.println("排序后" + Arrays.toString(a));
}
测试结果

在这里插入图片描述

char类型降序测试

@Test
public void testInsertSort() {
    char[] a = {'a','c','b','v','z','e','d'};
    System.out.println("排序前" + Arrays.toString(a));
    insertSort.dropSort(a);
    System.out.println("排序后" + Arrays.toString(a));
}
测试结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆卿之

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值