插入排序是非常好理解的。看图:

  注意,这里比较是从最后一个元素往前比较,如果当前的元素比上一个大,那么比较和交换的工作就此停止。如果是每次都从第一位开始比较的话,那么无论是否已经排好顺序,总是会比较n-1个元素,次数上是会比这种方法多的。

  代码如下:

public class InsertionSort {

    /**
     * 从第一个元素开始,与前面的元素进行比较
     * 如果当前元素大于上一个元素,那么比较停止,进入下一轮
     * 如果当前元素小于上一个元素,那么交换该元素与上一个元素,继续与之前的比较,一直到array[0]
     *
     * @param array
     */
    public static void sort(int[] array) {
        if (array == null || array.length < 2) {
            return;
        }

        for (int i = 1; i < array.length; i++) {
            for (int j = i; j >= 1; j--) {
                if (array[j] >= array[j - 1]) {
                    break;
                }
                Common.swampValue(array, j, j - 1);
            }
        }
    }

    public static void main(String[] args) {
        int[] array = {2, 3, 1, 4, 2, 44, 32, 13, 12, 56, 32, 12, 33, 21, 15, 16, 76, 45, 32, 33, 121, 123, 123, 122};
        sort(array);
        System.out.println("Arrays.toString(array) = " + Arrays.toString(array));
    }
}

 

  插入排序的最优情况就是完全顺序或者完全相等,那么当前元素与上一个比较之后就进入下一轮,时间复杂度为O(n)。最差情况就是倒序,时间复杂度为O(n^2),平均复杂度也为O(n^2)。空间复杂度由于每次都是一一比较交换,所以复杂度为O(1)。

 

 

posted on 2021-09-22 22:02  长江同学  阅读(79)  评论(0编辑  收藏  举报