基本思想

将数组中的所有元素依次和前面的已经排好序的元素相比较(依次),如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。

直接放菜

package com.lingaolu;

/**
 * @author 林高禄
 * @create 2020-05-08-16:28
 */
public class InsertSort {
    public static void main(String[] args) {
        int[] arr = {5, 2, 8, 99, 4, 77, 83, 22, 45, 25, 47, 64, 1};
        System.out.print("排序前数组:");
        println(arr);
        int arrNum = insertSort(arr);
        System.out.print("排序后数组:");
        println(arr);
        System.out.println("插入排序的比较次数是:" + arrNum);
        int[] arr2 = {1, 2, 3, 4, 5, 6, 7, 9, 8};
        System.out.print("排序前数组:");
        println(arr2);
        int arr2Num = insertSort(arr2);
        System.out.print("排序后数组:");
        println(arr2);
        System.out.println("插入排序的比较次数是:" + arr2Num);
    }

    // 插入排序
    public static int insertSort(int[] arr) {
        if (null == arr) {
            return 0;
        }
        int length = arr.length;
        int num = 0;
        for (int i = 1; i < length; ++i) {
            //单趟排序
            int end = i - 1;
            int tmp = arr[i];
            //循环继续条件
            while (end >= 0) {
                num++;
                if (arr[end] > tmp) {
                    arr[end + 1] = arr[end];
                    --end;
                } else {
                    break;
                }
            }
            arr[end + 1] = tmp;
        }
        return num;
    }

    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void println(int[] arr) {
        if (null == arr) {
            System.out.println("数组为空");
            return;
        }
        int length = arr.length;
        StringBuffer s = new StringBuffer();
        s.append("[");
        for (int i = 0; i < length; i++) {
            if (i == 0) {
                s.append(arr[i]);
            } else {
                s.append(",").append(arr[i]);
            }

        }
        s.append("]");
        System.out.println(s);
    }

}

结果

排序前数组:[5,2,8,99,4,77,83,22,45,25,47,64,1]
排序后数组:[1,2,4,5,8,22,25,45,47,64,77,83,99]
插入排序的比较次数是:44
排序前数组:[1,2,3,4,5,6,7,9,8]
排序后数组:[1,2,3,4,5,6,7,8,9]
插入排序的比较次数是:9

 同样的数组,与冒泡排序相比 ,可以看出插入排序大的效率比冒泡排序的高。