zoukankan      html  css  js  c++  java
  • 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('############################')
    })
  • 相关阅读:
    [源码]一个简单的源代码行数统计器
    [转载]一个java程序员的面试
    [源码]用c#创建支持多语言的应用程序
    Effective C#
    [源码]类似于 word 的颜色选择器 ColorPicker
    opera中开启WebGL
    Java学习之路
    邮箱正则表达式写法
    AX 2009 扩展类型控件的Lookup的写法
    唐骏的管理名言
  • 原文地址:https://www.cnblogs.com/mapingchuan/p/12993287.html
Copyright © 2011-2022 走看看