Java基础算法--插入排序

1、算法介绍

  1. 对前面的两个数据进行排序。
  2. 将第三个数据与前面的数据进行比较,然后将第三个数据插入到合适位置(如果第三个数据大于第二个数据则不进行操作,如果小于第二个数据,则将第二个数据进行后移(与第三个数据交换位置,第三个位置数据已经拷贝)一位)
  3. 第四个数据则与前面的三个数据进行比较,然后插入到合适位置。
  4. 重复以上步骤(循环 n - 1 次)

2、举例演示

原数组: [117, 101, 106, 155, 112]

第一次循环前数组:[117, 101, 106, 155, 112]

将前面两个数据进行排序,117 与 101进行交换位置。

先将101用一个临时变量进行拷贝,然后将117数据替换101,替换后数据为:[117, 117, 106, 155, 112]

然后将拷贝的101替换一号位置。

第一次循环后数组:[101, 117, 106, 155, 112]

第二次循环前数组:[101, 117, 106, 155, 112]

先拷贝106

然后将106与前面一个数据(117)进行比较,106 小于 117

将117数据替换106位置,替换后数据:[101, 117, 117, 155, 112]

然后将106与101比较,106 大于 101,直接将106替换117之前的位置(101后一个位置)。

第二次循环后数组:[101, 106, 117, 155, 112]

第三次循环前数组:[101, 106, 117, 155, 112]

先拷贝155

然后将155与前面一个数据(117)进行比较,155 大于 117

115替换自己的位置(换了个寂寞),循环结束。

第三次循环后数组:[101, 106, 117, 155, 112]

第四次循环前数组:[101, 106, 117, 155, 112]

先拷贝112

然后将112与前面一个数据(155)进行比较,112 小于 155

将数据115替换(后移一位)112位置,替换后数据:[101, 106, 117, 155, 155]

再将112与前面第二个数据(117)进行比较,112 小于117

将数据117后移一位,后移后的数据:[101, 106, 117, 117, 155]

再将112与前面第三个数据(106)进行比较,112 大于 106。

将112替换106后面一个位置的数据。

第四次循环后数组:[101, 106, 112, 117, 155]

3、图解

插入排序图解

4、代码实现

package sort;

import java.util.Arrays;

/**
 * <p>
 *
 * </p>
 *
 * @author: D
 * @since: 2020/9/8
 * @version: 1
 */
public class InsertionSortDemo {

    public static void main(String[] args) {
        int[] arr = {117, 101, 106, 155, 112};
        insertionSort(arr);
        System.out.println("排序后:" + Arrays.toString(arr));
    }

    private static void insertionSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int temp = arr[i];
            System.out.println("当前备份的数据:" + temp);
            // 保存当前拷贝的数据的前一个下标
            int preIndex = i - 1;
            // preIndex 小于 0 或者 temp大于前面的数据则不进入移动的循环
            while (preIndex >= 0 && temp < arr[preIndex]) {
                // 拷贝的数据小于比较的数据,将比较的数据后移一位/
                arr[preIndex+1] = arr[preIndex];
                System.out.println(temp + "小于" + arr[preIndex] + "," + arr[preIndex] + "后移一位");
                // 下标前移一位
                preIndex--;
                System.out.println("后移后:" + Arrays.toString(arr));
            }
            System.out.println("选中数据" + temp + "插入" + (preIndex + 1) + "位置");
            arr[preIndex + 1] = temp;
            System.out.println("插入后:" + Arrays.toString(arr));
            System.out.println();
        }
    }
}

5、运行结果

image-20200908222144581

猜你喜欢

转载自blog.csdn.net/d875708765/article/details/108479656