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('############################')
})
posted @ 2020-05-30 16:23  叮叮猫写BUG  阅读(522)  评论(0编辑  收藏  举报