Js排序算法

2020-10-23  本文已影响0人  SailingBytes

/**

    * 1、冒泡排序

    * 特点:

    * 采用双循环遍历计算,按照数组索引依次遍历,每次将相邻元素两两对比,实现元素交换;

    * 稳定,也是一种优化算法。

    */

    public bubbleSort(arr:any) {

        for (let i = 0; i < arr.length; i++) {

            // - 1 => 最后一次无元素对比;

            // - i => 只遍历当前数组 i 之后的所有元素;

            for (let j = 0; j < arr.length - 1 - i; j++) {

                if (arr[j] > arr[j + 1]) { // 由小到大

                    // let temp:any = arr[j + 1]; // 元素交换

                    // arr[j + 1] = arr[j];

                    // arr[j] = temp;

                    arr[j] = [arr[j + 1], arr[j + 1] = arr[j]][0];

                }

            }

        }

        return arr;

    }

    /**

    * 2、选择排序

    * 特点:

    * 采用双循环遍历计算,外层循环按照索引依次遍历,内层循环取外层当前元素后面的数据依次遍历,取外层每次遍历的参数,与内层循环遍历的参数对比,实现元素交换;

    * 思路清晰,但是适用于数据规模小的数组。

    */

    public selectionSort(arr:any) {

        let minIdx:any;

        let temp:any;

        for (let i = 0; i < arr.length - 1; i++) { // 最后一次无需参数对比

            minIdx = i;

            for (let j = i + 1; j < arr.length; j++) {

                if (arr[minIdx] > arr[j]) {

                    minIdx = j;

                }

            }

            temp = arr[i];

            arr[i] = arr[minIdx];

            arr[minIdx] = temp;

        }

        return arr;

    }

    /**

    * 2、插入排序

    * 特点:

    * 拆半插入

    * 采用双循环遍历计算,外层循环按照索引依次遍历,内层循环取外层当前元素后面的数据依次遍历,取外层每次遍历的参数,与内层循环遍历的参数对比,实现元素交换;

    * 思路清晰,但是适用于数据规模小的数组。

    */

    // public insertionSort(arr:any) {

    //    let minIdx:any;

    //    let temp:any;

    //    for (let i = 0; i < arr.length - 1; i++) { // 最后一次无需参数对比

    //        minIdx = i;

    //        for (let j = i + 1; j < arr.length; j++) {

    //            if (arr[minIdx] > arr[j]) {

    //                minIdx = j;

    //            }

    //        }

    //        temp = arr[i];

    //        arr[i] = arr[minIdx];

    //        arr[minIdx] = temp;

    //    }

    //    return arr;

    // }

    public insertionSort(arr: any) {

        var len = arr.length;

        var preIndex, current;

        for (var i = 1; i < len; i++) {

            preIndex = i - 1;

            current = arr[i];

            while(preIndex >= 0 && arr[preIndex] > current) {

                arr[preIndex+1] = arr[preIndex];

                preIndex--;

            }

            arr[preIndex+1] = current;

        }

        return arr;

    }

    /**

    * 归并排序(分治法)

    * 特点:自上而下的递归,自下而上的迭代

    * 分解(Divide):将n个元素分成个含n/2个元素的子序列。

    * 解决(Conquer):用合并排序法对两个子序列递归的排序。

    * 合并(Combine):合并两个已排序的子序列已得到排序结果。

    */

    public mergeSort(arr: any):any {

        if (arr.length < 2) {

            return arr;

        }

        let middle:any = Math.floor(arr.length / 2);

        let left:any = arr.slice(0, middle);

        let right:any = arr.slice(middle);

        return this.merge(this.mergeSort(left), this.mergeSort(right));

    }

    public merge(left:any, right:any) {

        let result:any = [];

        while (left.length && right.length) {

            if (left[0] <= right[0]) {

                result.push(left.shift());

            } else {

                result.push(right.shift());

            }

        }

        while (left.length)

            result.push(left.shift());

        while (right.length)

            result.push(right.shift());

        return result;

    }

上一篇下一篇

猜你喜欢

热点阅读