排序算法-插入排序

357 阅读2分钟

简介

插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个形成一个有序表。在其实现过程使用双层循环,外层循环除第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。

时间复杂度

O(n^2)

思路分析

排序规则:从小到大

在这里插入图片描述

  1. 有两个表,一张表A中存已排序好的(有序),默认放数组第一个元素。另一张表B中放未排序的元素
  2. 每次从B表中取第一个元素放入A表合适的位置,B中所有数据取出来后即排序完成。

具体可参考代码注释。

代码实现

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = {9, 2, 5, 3, 1};
        insertSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void insertSort(int[] arr) {
        // 排序规则:从小到大
        // 1.有两个表,一张表A中存已排序好的(有序),默认放数组第一个元素。另一张表B中放未排序的元素
        // 2.每次从B表中取第一个元素放入A表合适的位置,B中所有数据取出来后即排序完成。

        for (int k = 1; k < arr.length; k++) {
            // A表的索引 (while循环执行之前是A表中最后一个元素的索引)
            int aIndex = k - 1;
            // B表中取得数据
            int bVal = arr[k];

            while (
                    //  比较完A表中所有数据则退出循环
                    aIndex > -1
                    //  比较B表中取得元素和A表中元素比较
                    //  当B表中的元素比A表中的元素小时,则让当前A表中元素后移一位,前面一位预留给bVal
                    && bVal < arr[aIndex]
            ) {
                // 这里其实就是一个移动元素的过程,把当前元素移动到后一个位置,因为当前这个位置要预留给B中取出的元素
                // 下列例子是模拟交换过程,没有按实际排序走,用于理解交换逻辑。
                // int[] arr = {9, 2, 5, 3, 1};
                // 假设      aIndex = 2
                // arr[3] = arr[2]   =>    {9, 2, 5, 5, 1}
                // aIndex--;
                // 下一次循环 aIndex = 1
                // arr[2] = arr[1]   =>    {9, 2, 2, 5, 1}
                // aIndex--;
                // 下一次循环 aIndex = 0
                // arr[1] = arr[0]   =>    {9, 9, 2, 5, 1}
                arr[aIndex + 1] = arr[aIndex];
                aIndex--;
            }
			// 如果当前索引变化了,意味着有序列表中有比bVal大的值,才赋值,
            // 否则意味着A表中没有比bVal大的值,保持不动即可,也就是A表中的最后一个位置。(优化作用)
            if (aIndex + 1 != k) {
                arr[aIndex + 1] = bVal;
            }
        }
    }
}

运行输出:

[1, 2, 3, 5, 9]

总结

在这里插入图片描述

该算法的核心其实就是拿B表中的第一个元素和A表中一个个比较,从A表中最后一个元素开始比较找到合适的位置放入,B表中的元素取完则排序完成。