算法与数据结构 插入排序算法

本文详细介绍了插入排序算法的工作原理,通过实例展示了排序过程,并提供了Java代码实现。此外,还提出了一种改进的插入排序算法,减少了不必要的比较操作。
  1. 插入排序算法

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序是通过比较和插入来实现排序的,其排序流程如下:
(1)首先对数组的前两个数据进行从大到小的排序;
(2)接着将第三个数据与排好序的两个数据进行比较,将第三个数据插入合适的位置;
(3)再将第四个数据与前三个进行比较,重复以上步骤,直到最后一个数据插入合适的位置。
下面举一个实例来执行插入排序算法:
在这里插入图片描述
5个整型数据118,101,105,127,112,这是一组无序数据。对其执行插入排序过程,步骤如下:
(1)第1次排序,首先对数组的前两个数据118和101排序,由于118大于101,因此将其交换。此时排序后的数据为101、118、 105、 127、 112。

(2)第2次排序,对于第3个数据105,其大于101, 而小于18, 将其插入它们之间。此时排序后的数据为101、105、 118、 127、 112。

(3)第了次排序,对于第4个数据127其大于18将其插入118之后。此时排序后的数据为101、105、118、127、 112。

(4)第4次排序,对于第5个数据12,其大于105,小于18将其插入105和118之间。此时排序后的数据为101、105、 112. 118、 127。

  1. 实例实现代码:
 public static void main(String[] args) {
        int[] a = {118,101,105,127,112};
        insertionsort(a);
        System.out.println("最终排序结果:" + Arrays.toString(a));
    }

    private static void insertionsort(int[] a) {
        int n = 0;
        for (int i = 1; i < a.length;i++) {
            for(int j = i;j > 0 && a[j-1] > a[j]; j--) {
                swap(a,j-1,j);
                n++;
                System.out.println("第"+n+"步排序结果:"+Arrays.toString(a));
            }
        }
    }

    private static void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }1步排序结果:[101, 118, 105, 127, 112]2步排序结果:[101, 105, 118, 127, 112]3步排序结果:[101, 105, 118, 112, 127]4步排序结果:[101, 105, 112, 118, 127]
最终排序结果:[101, 105, 112, 118, 127]

改进算法:

 public static void main(String[] args) {
        int[] a = {118,101,105,127,112};
        insertionsortupper(a);
        System.out.println("最终排序结果:" + Arrays.toString(a));
    }

    private static void insertionsortupper(int[] a) {
        int n = 0;
        int ret = 0;
        int j = 0;
        for (int i = 0;i < a.length;i++) {
            ret = a[i];
            for (j = i;j > 0 && a[j - 1] > ret;j--) {
                a[j] = a[j - 1];
            }
            a[j] = ret;
            n++;
            System.out.println("第"+n+"步排序结果:"+Arrays.toString(a));
        }
    }1步排序结果:[118, 101, 105, 127, 112]2步排序结果:[101, 118, 105, 127, 112]3步排序结果:[101, 105, 118, 127, 112]4步排序结果:[101, 105, 118, 127, 112]5步排序结果:[101, 105, 112, 118, 127]
最终排序结果:[101, 105, 112, 118, 127]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值