[数据结构与算法]-排序算法之插入排序(insertion sort)及其实现(Java)

版权声明:本文为博主原创文章,转载时请注明出处,谢谢!喝酒不骑马 邮箱myz9412@163.com https://blog.csdn.net/Colton_Null/article/details/80874285

本文欢迎转载,转载前请联系作者,经允许后方可转载。转载后请注明出处,谢谢! http://blog.csdn.net/colton_null 作者:喝酒不骑马 Colton_Null from CSDN


一.什么是插入排序?

插入排序(insertion sort)是最简单的排序算法之一。它是一个稳定的排序算法

(Tips:所谓稳定,即两个相同元素,排序前和排序后他俩的顺序不发生改变。当然,这跟具体实现有一定关系。)

如果一个数组由N个元素组成,则插入排序由N - 1趟排序组成。对于p = 1到N - 1趟,插入排序保证从位置0到位置p上的元素为已排序状态。

即第一趟,从下标1处元素进行排序,保证数组0~1位置上的元素有序。
第二趟,从下标2处元素进行排序,保证数组0~2位置上的元素有序。
……
第N - 1趟,从下标N - 1处元素进行排序,保证数组0~N - 1位置上的元素有序。到此,整个数组排序完毕。

二.插入排序的举例实践

对于数组[46, 34, 32, 12, 14, 9]

  • p = 1趟之后:[34, 46, 32, 12, 14, 9]
  • p = 2趟之后:[32, 34, 46, 12, 14, 9]
  • p = 3趟之后:[12, 32, 34, 46, 14, 9]
  • p = 4趟之后:[12, 14, 32, 34, 46, 9]
  • p = 5趟之后:[9, 12, 14, 32, 34, 46]

三.插入排序复代码实现

InsertionSort.java

public class InsertionSort {

    /**
     * InsertionSort 插入排序
     *
     * @param arr 被排序的数组
     * @param <T>
     */
    public static <T extends Comparable<? super T>> void insertionSort(T[] arr) {
        int p;
        for (int i = 1; i < arr.length; i++) {
            // 储存当前访问的节点值
            T tmp = arr[i];
            for (p = i; p > 0 && tmp.compareTo(arr[p - 1]) < 0; p--) {
                // 如果tmp小于arr[p - 1]的值,则后移一位
                arr[p] = arr[p - 1];
            }
            // 将tmp替换p位置的值(上面的for已经将原来的p后移了)
            arr[p] = tmp;
        }
    }
}

InsertionSortTest.java 测试类

public class InsertionSortTest {
    public static void main(String[] args) {
        Integer[] arr = {46, 34, 32, 12, 14, 9};
        InsertionSort.insertionSort(arr);
        print(arr);
    }


    private static <T> void print(T[] arr) {
        for (T t : arr) {
            System.out.print(t.toString() + " ");
        }
        System.out.println();
    }
}

测试数组:[46, 34, 32, 12, 14, 9]
输出:9 12 14 32 34 46

四.插入排序算法复杂度分析

最坏情况,数组为倒序,嵌套循环的每次循环都要消耗N次迭代,因此插入排序的时间复杂度为O(N²)。
理想情况下,如果数组已经是排序好的情况,时间复杂度则为O(N)。

插入排序过程使用了i、p、tmp三个辅助变量,与问题规模无关,所以空间复杂度为O(1)。


有关[数据结构与算法]的学习内容已经上传到github,喜欢的朋友可以支持一下。 data-structures-and-algorithm-study-notes-java


站在前人的肩膀上前行,感谢以下博客及文献的支持。

展开阅读全文

没有更多推荐了,返回首页