JavaScript排序算法

JavaScript排序算法

class Sort {
    // 插入排序
    static doInsertSort(list = []) {
        let cnt=0;
        let arr = [...list];
        for (let i = 1; i < arr.length; i++) {
            let temp = arr[i];
            let j = i;
            while (j > 0 && arr[j - 1] >= temp) {
                arr[j] = arr[j - 1];
                j--;
                cnt++
            }
            arr[j] = temp;
        }
        return [arr,cnt];
    }
    // 希尔排序
    static doShellSort(list = []) {
        let cnt=0;
        let arr = [...list];
        let len = arr.length;
        for (let gap = Math.floor(len / 2); gap >= 1; gap = Math.floor(gap / 2)) {
            for (let i = gap; i < len; i++) {
                let temp = arr[i];
                let j = i;
                while (j >= gap && arr[j - gap] >= temp) {
                    arr[j] = arr[j - gap];
                    j -= gap;
                    cnt++;
                }
                arr[j] = temp;
            }
        }
        return [arr,cnt];
    }
    // 快速排序
    static doQuickSort(arr = []) {
        if (arr.length <= 0) { 
            return [];
        }
        let leftArr = [];
        let rightArr = [];
        let middleArr = [];
        let pivot = arr[0];

        arr.forEach(item => {
            if (item < pivot) {
                leftArr.push(item);
            } else if (item > pivot) {
                rightArr.push(item);
            } else {
                middleArr.push(item);
            }
        });
        return Sort.doQuickSort(leftArr).concat(middleArr, Sort.doQuickSort(rightArr));
    }
    // 归并排序
    static doMergeSort(list = []) {
        let cnt=0;
        let result = [];
        let temp = [];
        for (let step = 1; step < list.length; step *= 2) {
            for (let i = 0; i <= list.length; i += step * 2) {
                temp = Sort.mergeSortedArr(list.slice(i, i + step), list.slice(i + step, i + step * 2))
                result.push(...temp);
                cnt++
            }
            list = result;
            result = [];
        }
        return [list,cnt];
    }

    static mergeSortedArr(leftArr = [], rightArr = []) {
        let result = [];
        while (leftArr.length > 0 && rightArr.length > 0) {
            if (leftArr[0] <= rightArr[0]) {
                result.push(leftArr.shift());
            } else {
                result.push(rightArr.shift());
            }
        }
        if (leftArr.length > 0) {
            result = result.concat(leftArr);
        } else {
            result = result.concat(rightArr);
        }
        return result;
    }
    // 冒泡排序
    static doBubbleSort(list = []) {
        let cnt=0;
        let arr = [...list];
        for (let i = arr.length; i >= 2; i--) {
            for (let j = 0; j <= i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    let temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
                cnt++
            }
        }
        return [arr,cnt];
    }
    //选择排序
    static doChooseSort(list = []) {
        let cnt=0;
        let arr = [...list]
        for (let i = 0; i < arr.length - 1; i++) {
            for (let j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    let temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
                cnt++
            }
        }
        return [arr,cnt];
    }
}

let a = [72, 54, 59, 30, 31, 78, 2, 77, 82, 72]
console.log(Sort.doInsertSort(a));
console.log(Sort.doShellSort(a));
console.log(Sort.doQuickSort(a));
console.log(Sort.doMergeSort(a));
console.log(Sort.doChooseSort(a));
console.log(Sort.doBubbleSort(a)); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值