最坏、平均时间复杂度:O(n2)
    最好时间复杂度:O(n)
    空间复杂度:O(1)

    1. for (int i = 1; i < array.length; i++) {
    2. int cur = i;
    3. while (cur > 0 && cmp(cur, cur - 1) < 0) {
    4. //交换元素
    5. swap(cur, cur - 1);
    6. cur--;
    7. }
    8. }

    逆序对:

    1. for (int i = 1; i < array.length; i++) {
    2. int cur = i;
    3. E temp = array[cur];
    4. while (cur > 0 && cmp(cur, cur - 1) < 0) {
    5. array[cur] = array[cur - 1];
    6. cur--;
    7. }
    8. array[cur] = temp;
    9. }

    二分搜索优化插入排序

    1. public void sort() {
    2. for (int i = 1; i < array.length; i++) {
    3. E value = array[i];
    4. //挪动范围
    5. int insertIndex = search(i);
    6. for (int j = i; j > insertIndex; j--) {
    7. array[j] = array[j-1];
    8. }
    9. array[i] = value;
    10. }
    11. }
    12. public int search(int index) {
    13. int begin = 0;
    14. int end = array.length;
    15. while (begin < end) {
    16. int mid = (begin + end) >> 1;
    17. if (cmp(array[index], array[mid]) < 0) {
    18. end = mid;
    19. }else {
    20. begin = mid + 1;
    21. }
    22. }
    23. return begin;
    24. }
    25. //注意 使用二分搜索后,只是减少了比较次数,但是插入排序的平均复杂度任然是O(n^2)