• js实现排序算法(快速排序,冒泡排序,插入排序,选择排序)


    快速排序:

    找到一个基数,在一轮排序后:这个数之前的数都比它小,这个数之后的数都比它大;然后以这个数为分割对它前面的数和后面的数再做相同的操作即可,注意找到临界点

    function sort(arr = []) {
        if (!Array.isArray(arr) || arr.length < 2) return arr;
        function sortWrapper(args, s, e) {
            let temp = args[e];
            let i = s, j = e;
            while (i !== j) {
                while (args[i] <= temp && i < j) {
                    i++;
                }
                [args[i], args[j]] = [args[j], args[i]];
                while (args[j] >= temp && i < j) {
                    j--
                }
                [args[i], args[j]] = [args[j], args[i]];
    
            }
            if (s <= i - 1) sortWrapper(args, s, i - 1);
            if (e >= i + 1) sortWrapper(args, i + 1, e);
        }
        sortWrapper(arr, 0, arr.length - 1);
        return arr;
    }
    new Array(5).fill(0).forEach(() => {
        const arr = Array(20).fill(0).map(() => parseInt(Math.random() * 100));
        console.log('排序前', arr);
        console.log('排序后', sort(arr));
        console.log('############################')
    })

    冒泡排序:

    每一轮通过交换的方式交换出一个最大值放在数组末尾,上次交换出的最后一个数不应该在进行多余的交互,故每次交换的数组长度需要减一

    function sort(arr = []) {
        if (!Array.isArray(arr) || arr.length < 2) return arr;
        for (let i = 0; i < arr.length; i++) {
            for (let j = 0; j < arr.length - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
                }
            }
        }
        return arr;
    }
    new Array(5).fill(0).forEach(() => {
        const arr = Array(20).fill(0).map(() => parseInt(Math.random() * 100));
        console.log('排序前', arr);
        console.log('排序后', sort(arr));
        console.log('############################')
    })
    选择排序:

    每次选择出极值放在开头或结尾,下次从剩下的数据中再选出极值,直到数据只剩最后一个

    function sort(arr = []) {
        if (!Array.isArray(arr) || arr.length < 2) return arr;
        function getMaxIndex(tempArr = []) {
            if (tempArr.length < 2) return tempArr[0];
            let max = 0;
            for (let i = 1; i < tempArr.length; i++) {
                max = tempArr[max] > tempArr[i] ? max : i;
            }
            return max;
        }
        for (let i = 0; i < arr.length - 1; i++) {
            const tempArr = [];
            for (let j = 0; j < arr.length - i; j++)tempArr[j] = arr[j];
            const maxIndex = getMaxIndex(tempArr);
            const lastIndex = arr.length - 1 - i;
            if (maxIndex !== lastIndex) [arr[lastIndex], arr[maxIndex]] = [arr[maxIndex], arr[lastIndex]];
        }
        return arr;
    }
    new Array(5).fill(0).forEach(() => {
        const arr = Array(20).fill(0).map(() => parseInt(Math.random() * 100));
        console.log('排序前', arr);
        console.log('排序后', sort(arr));
        console.log('############################')
    })
    插入排序:

    从第二个数开始,把这个数拿出来和前面的数做从后向前的对比,如果比它小就插到前面,知道前面的数交换完(比这个数大的都往后挪一个位置)

    function sort(arr = []) {
        if (!Array.isArray(arr) || arr.length < 2) return arr;
        for (let i = 0; i < arr.length; i++) {
            for (let j = i - 1; j > -1; j--) {
                if (arr[j] >= arr[j + 1]) [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
            }
        }
        return arr;
    }
    new Array(5).fill(0).forEach(() => {
        const arr = Array(20).fill(0).map(() => parseInt(Math.random() * 100));
        console.log('排序前', arr);
        console.log('排序后', sort(arr));
        console.log('############################')
    })
  • 相关阅读:
    三栏布局
    两栏布局
    WEB前端开发笔试题(1)
    JavaScript document 对象
    设计一个有3个超链接的页面,单击这些链接时分别打开和关闭窗口以及关闭本身窗口。
    在窗体中有两个多选列表,用户可以从左侧列表中选择任意项,添加到右侧列表中。反之亦然。
    How and when: ridge regression with glmnet
    Fitting Bayesian Linear Mixed Models for continuous and binary data using Stan: A quick tutorial
    An Introduction to Stock Market Data Analysis with R (Part 1)
    Lesser known purrr tricks
  • 原文地址:https://www.cnblogs.com/mapingchuan/p/12993287.html
Copyright © 2020-2023  润新知