002 插入排序(一) 基础

算法描述

  • 从第二个元素开始,依次插入其前有序数列(可以提前终止内循环的原因)的合适位置;

时间复杂度

  • 最好情况,O(N),数组近乎有序的情况下;
  • 最坏情况,O(N^2);
  • 平均情况,O(N^2);

算法实现

  • 外层循环控制遍历的范围,一点点变大;
  • 内层循环在范围里比较,和前面的元素比;
  • 注意插入排序的内层循环的时候,是有机会提前终止的(比之前的元素大),不必将内层循环完整走一遍;
  • 注意swap(Object[] arr, int j, int i) 中,数组的入参是用 Object[] 而不是 Compareble[];
import util.SortTestHelper;

public class InsertionSort {

    private InsertionSort(){}

    public static void sort(Comparable[] arr) {
        for (int i = 1; i < arr.length; i++) {
            for (int j = i; j > 0; j--) {
                if (arr[j].compareTo(arr[j - 1]) < 0) {
                    swap(arr, j, j - 1);
                } else {
                    break;
                }
            }
        }
    }

    private static void swap(Object[] arr, int j, int i) {
        Object temp = arr[j];
        arr[j] = arr[i];
        arr[i] = temp;
    }

    public static void main(String[] args) {
        int N = 10000;
        Integer[] arr = SortTestHelper.generateRandomArray(N, 0, 100000);
        SortTestHelper.testSort("_02.sortingbaisc._05.InsertionSort", arr);
    }

}

输出:

InsertionSort : 156ms

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 5,227评论 0 1
  • 01. 姥爷死了,妈妈带我去参加葬礼。 姥爷躺在一个木头做的大盒子里,身上盖着白色的布。躺在里面,我感觉他睡着了。...
    正在发育阅读 5,585评论 0 1
  • 薛定谔的q阅读 1,053评论 0 0
  • 2017年3月20日 星期一 晴 今日春分,大晴天,晒得人暖洋洋的,回家的路上,孩子向我诉说多希望每天都下雨,别出...
    朱砂紅塵阅读 1,833评论 0 0