插入排序

74 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第二十二天,点击查看活动详情

三、插入排序

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

基本思想

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

image-20220902231718276

分析

原始数组:101, 34, 119, 1

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
​
/**
 * @author Kcs 2022/9/3
 */
public class InsertSort {
    public static void main(String[] args) {
        int[] arr = {101, 34, 119, 1, 45, 78};
        System.out.println("排序前结果:" + Arrays.toString(arr));
        insertSort(arr);
        System.out.println("排序后结果:" + Arrays.toString(arr));
​
​
        // 测试冒泡排序的时间复杂度, 用一个较大的数据进行测试
        int[] test = new int[8000];
        for (int i = 0; i < 8000; i++) {
            test[i] = (int) (Math.random() * 80000);
​
        }
        Date beforeDate = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formatBefore = simpleDateFormat.format(beforeDate);
        System.out.println("排序前时间" + formatBefore);
​
        insertSort(test);
​
        Date afterDate = new Date();
        String afterDateformat = simpleDateFormat.format(afterDate);
        System.out.println("排序后时间" + afterDateformat);
    }
​
    /**
     * 插入排序
     */
    public static void insertSort(int[] arr) {
        int insertValue = 0;
        int insertIndex = 0;
​
        for (int i = 1; i < arr.length; i++) {
            //定义待插入的数
            insertValue = arr[i];
​
            //arr[1] 前面这个数的索引
            insertIndex = i - 1;
​
            //insertValue 找到插入的位置  由小到大 < ;由大到小:<
            // insertIndex >= 0 放置越界
            // insertValue < arr[insertIndex] : 带插入的数字
            // arr[insertIndex] 后移
            while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
                arr[insertIndex + 1] = arr[insertIndex];
                insertIndex--;
            }
            //找到插入的位置
            if (insertIndex + 1 == i) {
                arr[insertIndex + 1] = insertValue;
            }
            // System.out.println("第" + i + "轮排序结果:" + Arrays.toString(arr));
        }
    }
}