用JS实现5种常用排序

//1、冒泡排序
Array.prototype.bubbleSort = function () {
    //主要思想:找到最大值->次大值->....依次放到序列最后面
    //------从后面开始有序,前面无序,需要寻找
    for (let i = 0; i < this.length - 1; i++) {//注意:边界
        for (let j = 0; j < this.length - i - 1; j++) {//注意:边界
            if (this[j] > this[j + 1]) {
                var tmp = this[j + 1];
                this[j + 1] = this[j];
                this[j] = tmp;
            }
        }
    }
    return this;
}


//2、插入排序
Array.prototype.insertionSort = function () {
    //主要思想:找到一个数,前移直到某一个位置,前一个数比它更小
    //从前开始有序
    for (let i = 1; i < this.length; i++) {
        const cur = this[i];     //当这个位置的数取出来时,相当于此处空了出来,可以依次往后移动
        for (let j = i - 1; j >= 0; j--) {
            if (this[j] > cur) {
                this[j + 1] = this[j];
                if (j === 0) {//当已经到开头的位置时候,移动了,但是由于j没有修改开头
                    this[j] = cur;
                }
            }
            else {//停止
                this[j + 1] = cur;
                break;
            }
        }
    }
    return this;
}

//3、选择排序
Array.prototype.selectSort = function () {
    //主要思想:和冒泡排序找大的放后不同,这个是两次遍历找最小放在前面
    //从前面开始有序
    for (let i = 0; i < this.length - 1; i++) {
        let min = this[i], min_index = i;
        for (let j = i + 1; j < this.length; j++) {
            if (this[j] < min) {
                min = this[j];
                min_index = j;
            }
        }
        //交换位置,不是直接替代!!!
        const tmp = this[i];
        this[i] = min;
        this[min_index] = tmp;
    }

    return this;
}

//---------递归思想
//4、归并排序
Array.prototype.mergeSort = function () {
    //主要思想:两两区间有序再归并
    //创建递归子函数
    var merge = (arr) => {
        const len = arr.length;
        if (len <= 1) return arr;//-------对于递归一定要创造递归终结条件
        let res = [];
        const mid = Math.floor(len / 2);
        //slice切割,左右都有序
        //注意左右区间取值长度-------一定要有可能arr长度为1,,,,所以mid+1会导致死循环
        let leftArr = merge(arr.slice(0, mid));
        let rightArr = merge(arr.slice(mid, len));

        //合并两个有序数据
        //-----有趣的JS做法
        while (leftArr.length || rightArr.length) {
            if (leftArr.length && rightArr.length) {
                res.push(leftArr[0] < rightArr[0] ? leftArr.shift() : rightArr.shift());
            }
            else if (leftArr.length) {
                res.push(leftArr.shift());
            }
            else if (rightArr.length) {
                res.push(rightArr.shift());
            }
        }
        return res;
    }

    let res = merge(this);
    res.forEach((n, i) => {
        this[i] = n;
    })
    return this;
}



//5、快速排序
Array.prototype.fastSort = function () {
    //主要思想,找到一个基准值,左边全放它小的;右边全放大的
    let fast = (arr) => {
        const len = arr.length;
        if (len <= 1) return arr;

        //始终以第一个元素作为基准值
        const cur = arr[0];

        let left = [];
        let right = [];
        //开始找其他的数要排除自己!!!!   所以i的初始值要设置为  1   !!
        for (let i = 1; i < len; i++) {
            if (arr[i] < cur) {
                left.push(arr[i]);
            }
            else {
                right.push(arr[i]);
            }
        }

        return [...fast(left), cur, ...fast(right)];

    }

    let res = fast(this);
    res.forEach((n, i) => {
        this[i] = n;
    })
    return this;

}


//注意:Array初始化的方法!!!无需中括号
//var arr=[....];   隐式创建Array
var arr = new Array(2, 8, 9, 10, 1, 5, 6, 4, 3, 7);
//测验
//arr.bubbleSort();
//arr.insertionSort();
//arr.selectSort();
//arr.mergeSort();
arr.fastSort();
console.log(arr);

猜你喜欢

转载自blog.csdn.net/weixin_57208584/article/details/129642842