插入排序的步骤是从第二个数开始往前比较,如果前面的数字比第二个数大,则向后移一位。知道再也找不到比第二个数大的时候,将第二个数插入到该位置。第二轮则是从第三个数开始,以此类推。

    1. enum Compare {
    2. LESS_THAN,
    3. BIGGER_THAN,
    4. EQUAL,
    5. }
    6. /**
    7. * 比较两个数的大小
    8. * @param a
    9. * @param b
    10. */
    11. function defaultCompare<T>(a: T, b: T): Compare {
    12. if (a < b) {
    13. return Compare.LESS_THAN;
    14. } else if (a === b) {
    15. return Compare.EQUAL;
    16. } else {
    17. return Compare.BIGGER_THAN;
    18. }
    19. }
    20. function insertionSort<T>(array: T[], compareFn = defaultCompare): T[] {
    21. for (let i = 1; i < array.length; i++) {
    22. const tmp = array[i]
    23. let insertPos = i
    24. for (let j = i - 1; j >= 0; j--) {
    25. if (compareFn(array[j], tmp) === Compare.BIGGER_THAN) {
    26. array[j+1] = array[j]
    27. insertPos = j
    28. } else {
    29. break;
    30. }
    31. }
    32. if (insertPos !== i) {
    33. array[insertPos] = tmp
    34. }
    35. }
    36. return array
    37. }

    时间复杂度分析:插入排序 - 图1