Java-插入排序算法-(三)

插入排序的原理

把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;每一趟排序过程都从无序表中取出第一个元素,按顺序去比较有效表(大到小)的数据,将它插入到有序表正确位置,使之成为新的有序表,重复n-1次完成整个排序过程。

插入排序的思路

插入排序的基本思想:给定数组:int[] array={里面n个数据};

  1. 第一趟排序

array[1]array[0]比较,array[1]<array[0],进行交换;

  1. 第二趟排序

array[2]array[1]比较,
array[2]<array[1],进行交换;
接着array[1]array[0]比较,
array[1]<array[0],进行交换;

  1. 第三趟排序

array[3]array[2]比较,
array[3]<array[2],进行交换;
接着array[2]array[1]比较,
array[2]<array[1],进行交换;
接着array[1]array[0]比较,
array[1]>array[0],不交换;

  1. 第i趟排序

以此类推,从array[i]array[i-1]比较,
如果array[i]<array[i-1],进行交换;
一直往前进行比较,直到出现array[n-i]>array[n-i-1],
说明array[n-i]大于array[n-i-1]前面的值;

插入排序的图解步骤

在这里插入图片描述

插入排序的实现

源码地址:GitHub-AralSea,插入排序的实现 SelectionSort类:代码片.

    /**
     * 插入排序的实现
     * @param array
     * @param <T>
     */
    public static <T extends Comparable<T>> void insertionSort(T[] array) {
        if (null != array && array.length > 0) {
            int length = array.length;
            for (int i = 0; i < length; i++) {
                // 繁琐
                /*for (int j = i; j > 0; j--) {
                    if (array[j].compareTo(array[j-1]) < 0) {
                        // 交换
                        SortTestHelp.swap(array, j, j-1);
                    } else {
                        break;
                    }
                }*/

                // 改建方式
                for (int j = i; j > 0 && array[j].compareTo(array[j-1]) < 0; j--) {
                    // 交换
                    SortTestHelp.swap(array, j, j-1);
                }
            }
        }
    }

插入排序的测试

	public static void main(String[] args) {
        Integer[] array = {3,6,2,9,7,5,8,0,1,4};
        insertionSort(array);
        System.out.println(Arrays.toString(array));

        // 1.随机生成数组,测试选择排序 和 插入排序的时间比较
        int n1 = 10000;
        Integer[] array1 = SortTestHelp.generateRandomArray(n1, 0, n1);
        System.out.println("array1数组:");
        System.out.println(Arrays.toString(array1));

        // 复制一份
        Integer[] array2 = Arrays.copyOf(array1, n1);
        System.out.println("随机生成数组,测试选择排序 和 插入排序的时间比较:");
        SortTestHelp.testSort("10万数量的selectionSort", SelectionSort::selectionSort, array1);
        SortTestHelp.testSort("10万数量的insertionSort", InsertionSort::insertionSort, array2);
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
    }

测试结果

在这里插入图片描述

链接: 个人博客.GitHub

猜你喜欢

转载自blog.csdn.net/m0_37583608/article/details/89673501
今日推荐