Java 插入排序

58 阅读2分钟

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

前序

上两篇:

冒泡排序 选择排序

话不多说这进入正题吧!!!

插入排序

理论

排队算法:

对应插入排序 ,其实就好比我们小时候进行排队的那种,最开始我们大家一起过来,然后呢第一个人不要动,老师看一眼第二个 诶 比第一个矮一点 来你去第一个 ,然后第三个人继续这样 一次次的排....就这样从第一个开始 慢慢的拉后面的一个和前面的人进行比较然后 最好拍好了😂

排序示意图:

insertionSort.gif

插入排序.gif

实践

coding

/***
 * insertSortTest 测试
 */
@Test
public void insertSortTest() {
    int[] ints = {1, 3, 5, 8, 2, 2, 7, 7, 6, 88, 23, 56, 21, 15};

    System.out.println("原始数组数据");
    for (int i = 0; i < ints.length; i++) {
        System.out.print(ints[i] + ",");
    }
    long l = System.nanoTime();
    //算法中间部分
    //插入排序 跳过第一个因为我觉得第一个是正确的不需要排队
    for (int i = 1; i < ints.length; i++) {
        int j = i;
        //记录一下待会儿需要交换的数据
        int tmp = ints[i];
        // while true 找 特定坐标前面比当前数据小的数据 的最靠前位置进行坐标替换
        // 如果前面比当前位置小的一步步的往的坐标进行移动
        // 改 while 能够计算出最后 前面已经有序 并且不在有比当前 tmp 数量小的数据的数据下标 J
        while (j>0 && tmp < ints[j - 1]) {
            //一步步的进行前面的数据对比并且交换位置 j-- 能够 控制  比较   比如   3:2  2:1 这样的操作    
            // 这里数据值进行直接插入位置前的数据交换
            ints[j] = ints[j-1];
            j--;
        }
        //如果前面的数据存在小的 那么将 最终最合理前面没有比当前J 还小的下标记
        if(j!=i){
            // 将该位置的数据放在最后前面不再有比他小的数据下表处
            ints[j] = tmp;
        }
    }
    // 使用纳秒计算时间信息
    System.out.println("耗时" + (System.nanoTime() - l));
    System.out.println("排序之后的数据");
    for (int i = 0; i < ints.length; i++) {
        System.out.print(ints[i] + ",");
    }

}

测试结果

image.png

排序法总结

image.png 关于稳定性上 ,这个排序算法和冒泡排序一样就算数据一样 排序是也不会改变对象的初始话地址的 相对位置 及 两个 都是A 但是 A1 始终在 A2 前面

然后时间复杂度 和 冒泡类似如果本省部分有序 会减少相应的 while true 所以 范围为 O(n)~O(n^2)

这边需要注意的是最后的交换来说就只有相应位置的数据一定一次 及 插入 而不是 相邻数据交换!!!

Ending

下一篇: 希尔排序