选择排序 - 图1

    选择排序大致的思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推。

    1. export enum Compare {
    2. LESS_THAN,
    3. BIGGER_THAN,
    4. EQUAL,
    5. }
    6. /**
    7. * 比较两个数的大小
    8. * @param a
    9. * @param b
    10. */
    11. export 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. /**
    21. * 交换索引 a 和索引 b 的位置的值
    22. * @param array 数组
    23. * @param a 索引位置 a
    24. * @param b 索引位置 b
    25. */
    26. export function swap<T>(array: T[], a: number, b: number): void {
    27. [array[a], array[b]] = [array[b], array[a]];
    28. }
    29. function bubbleSort<T>(array: T[], compareFn = defaultCompare): T[] {
    30. const { length } = array;
    31. for (let i = 0; i < length; i++) {
    32. for (let j = 0; j < length - 1 - i; j++) {
    33. if (compareFn(array[j], array[j + 1]) === Compare.BIGGER_THAN) {
    34. swap(array, j, j + 1);
    35. }
    36. }
    37. }
    38. return array;
    39. }

    时间复杂度分析:选择排序 - 图2