随笔 - 214  文章 - 0 评论 - 11 阅读 - 20万
< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

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

  注意,这里比较是从最后一个元素往前比较,如果当前的元素比上一个大,那么比较和交换的工作就此停止。如果是每次都从第一位开始比较的话,那么无论是否已经排好顺序,总是会比较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   长江同学  阅读(80)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示