美文网首页
Js排序算法

Js排序算法

作者: SailingBytes | 来源:发表于2020-10-23 20:32 被阅读0次

    /**

        * 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;

        }

    相关文章

      网友评论

          本文标题:Js排序算法

          本文链接:https://www.haomeiwen.com/subject/knlbmktx.html