排序

版权声明:个人笔记,不喜勿喷 https://blog.csdn.net/qq_39571197/article/details/84308123
function insertionSort(arr, display) {
            if (display) {
                utils.displayArr(arr, '#000');
            }
            for (let i = 1; i < arr.length; i++) {
                /**
                 * 通过i,将数组分为已排序、temp、未排序两部分
                 * [8,7,6,5,4,3,2,1,0]
                 * i = 0,[] 8 [7,6,5,4,3,2,1,0]
                 * i = 1,[8] 7 [6,5,4,3,2,1,0] 排序完如下
                 * i = 2,[7,8] 6 [5,4,3,2,1,0] 排序完如下
                 * i = 3,[6,7,8] 5 [4,3,2,1,0] 排序完 [5,6,7,8] [4,3,2,1,0]
                 * 内层的while循环,拿到temp,插入到已排序
                 */
                let temp = arr[i];
                let j = i - 1;
                while (j >= 0 && arr[j] > temp) {
                    arr[j + 1] = arr[j];
                    j--;
                }
                arr[j + 1] = temp;
                if (display) {
                    // 关于len - sortLen
                    utils.displayArr(arr);
                }
            }
            return arr;
        }
function selectionSort(arr, display) {
            if (display) {
                utils.displayArr(arr, '#000');
            }
            let len = arr.length - 1;
            for (let i = 0; i < len; i++) {
                /**
                 * 顺序选取,保证每次循环都有一个数字被排好,可减少一次循环
                 * [1,3,0,4,2]
                 * len = 4
                 * i = 0,[] 1 [3,0,4,2] -> [] 0 [3,1,4,2]
                 * i = 1,[0] 3 [1,4,2] -> [0] 1 [3,4,2]
                 * i = 2,[0,1] 3 [4,2] -> [0,1] 2 [4,3]
                 * i = 3,[0,1,2] 4 [3] -> [0,1,2] 3 [4]
                 */
                let mixIndex = i;
                for (let j = i + 1; j <= len; j++) {
                    if (arr[j] < arr[mixIndex]) {
                        mixIndex = j; // 记录最小值
                    }
                }
                let temp = arr[mixIndex];
                arr[mixIndex] = arr[i];
                arr[i] = temp;
                if (display) {
                    // 关于len - sortLen
                    utils.displayArr(arr);
                }
            }
            return arr;
        }

 function selectionSort2(arr) {
            const LEN = arr.length - 1;
            for (let i = 0; i < LEN; i++) {
                let min = i;
                for (let j = i; j <= LEN; j++) {
                    if (arr[j] < arr[min]) {
                        min = j;
                    }
                }
                let temp = arr[min];
                arr[min] = arr[i];
                arr[i] = temp;
            }
            return arr;
        }
function bubblingSort(arr, display) {
            if (display) {
                utils.displayArr(arr, '#000');
            }
            const len = arr.length - 1;
            main:
            /**
                 * 为什么不是 i>=0 ?【其它算法同理】
                 * 假如[5,4,3,2,1],5个数,len=4
                 * i=4 [4,3,2,1] [5]
                 * i=3 [3,2,1]   [4,5]
                 * i=2 [2,1]     [3,4,5]
                 * i=1 [1]       [2,3,4,5]
                 * 由于每次找出一个数,此时4个数已经排序好了,
                 * 几个循环下来,剩的一个肯定是最小的数(左边的数大于右边的数,则交换) 
             */
            for (let i = len; i > 0; i--) {
                /**
                 * 每次有 len-i 个元素未排序
                 * 因为每次循环都会找出一个最大的数,而且在末尾
                 * [1,3,0,4,2]
                 * 第一次 -> [1,0,3,2] [4] // 最大4,末尾
                 * 第二次 -> [0,1,2] [3,4] // 最大3,末尾
                 * 第三次 -> 因为没有交换,所以排序完成
                 */
                // 可能有一次排序已完成
                let isMess = false;
                for (let j = 0; j < i; j++) {
                    // 因为内部用到了arr[j + 1],所以不需要 j <= i,
                    if (arr[j] > arr[j + 1]) {
                        let temp = arr[j + 1];
                        arr[j + 1] = arr[j];
                        arr[j] = temp;
                        isMess = true;
                    }
                }
                if (!isMess) {
                    break main;
                }
                if (display) {
                    // 关于len - sortLen
                    utils.displayArr(arr);
                }
            }
            return arr;
        }

 

 

没有更多推荐了,返回首页