每天一个算法(2):插入排序(java)

插入排序

就像我们整理扑克牌一样:摸起一张牌,然后将牌插入到合适位置;
示意:
需要被排序的数组: [10, 3, 2, 1, 0, 5, 4, 7, 8, 9]
第1次: [3, 10, 2, 1, 0, 5, 4, 7, 8, 9] 将3插入有序数组【10】之中
第2次: [2, 3, 10, 1, 0, 5, 4, 7, 8, 9] 将2插入有序数组【3、10】之中
第3次: [1, 2, 3, 10, 0, 5, 4, 7, 8, 9] 将1插入有序数组【2、3、10】之中
第4次: [0, 1, 2, 3, 10, 5, 4, 7, 8, 9] 将0插入有序数组【1、2、3、10】之中
第5次: [0, 1, 2, 3, 5, 10, 4, 7, 8, 9] 将5插入有序数组【0、1、2、3、10】之中
第6次: [0, 1, 2, 3, 4, 5, 10, 7, 8, 9] 将4插入有序数组【0、1、2、3、5、10】之中
第7次: [0, 1, 2, 3, 4, 5, 7, 10, 8, 9] 将7插入有序数组【0、1、2、3、4、5、10】之中
第8次: [0, 1, 2, 3, 4, 5, 7, 8, 10, 9] 将8插入有序数组【0、1、2、3、4、5、7、10】之中
第9次: [0, 1, 2, 3, 4, 5, 7, 8, 9, 10] 将9插入有序数组【0、1、2、3、4、5、7、9、10】之中

代码

public static void insert_sort(int arr[]){
        int temp, j;
        for(int i = 1; i < arr.length; i++){
            temp = arr[i];
            // 以i位置为分割线, [0, i-1]为一个有序数组, [i, arr.length]为无序数组
            // 用temp临时变量保存i位置的数据, 然后拿i位置的数据arr[i] 和 [0, i-1]之内的有序数组,
            // 进行比较放到有序数组中比这个数字最后一个大的数据的后面。
            for(j = i; j > 0 && arr[j-1] > temp; j--){
                arr[j] = arr[j-1];  // 向前移动一个位置
            }
            arr[j] = temp;  // 插入比这个数最后一个大的后面
            System.out.println("第" + i + "次: " + Arrays.toString(arr));
        }
    }

    public static void main(String[] args){
        int arr[] = new int[] {10, 3, 2, 1, 0, 5, 4, 7, 8, 9};
        System.out.println("原数组:");
        System.out.println(Arrays.toString(arr));
        InsertSort.insert_sort(arr);
        System.out.println("现数组:");
        System.out.println(Arrays.toString(arr));
    }

时间复杂度分析
把n个元素的序列 升序 排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。如果需要排序的数据量很小,那么插入排序还是一个不错的选择。

猜你喜欢

转载自blog.csdn.net/yhflyl/article/details/80841288