js 快排与归并

116 阅读1分钟
        function quickSort(arr) {
            if (arr.length <= 1) return arr
                // 数组中间值下标:
            var index = Math.floor(arr.length / 2)
                // 得到中间值,并把它从数组中取出
            var intermediateValue = arr.splice(index, 1)[0]
                // 比较,比它小的方左边,大的或相等的放右边
            var left = []
            var right = []
            for (let i = 0; i < arr.length; i++) {
                arr[i] > intermediateValue ? right.push(arr[i]) : left.push(arr[i])
            }
            // 递归调用:
            return quickSort(left).concat([intermediateValue], quickSort(right))
        }

        var numArr = [1, 8, 6, 3, 55, 22, 17, 15, 2, 3]
        console.log(quickSort(numArr)) // 输出: (10) [1, 2, 3, 3, 6, 8, 15, 17, 22, 55]

参考:阮一峰快排

        function divice(arr) {
            if (arr.length === 1) return arr
            var mid = Math.floor(arr.length / 2)
            var left = arr.slice(0, mid)
            var right = arr.slice(mid)
                // 递归拆分
            return merge(divice(left), divice(right))
        }

        // 组合
        function merge(left, right) {
            var temp = []
            while (left.length > 0 && right.length > 0) {
                left[0] < right[0] ? temp.push(left.shift()) : temp.push(right.shift())
            }
            return temp.concat(left, right)
        }
        var numArr = [1, 8, 6, 3, 55, 22, 17, 15, 2, 3]
        console.log(divice(numArr)) // 输出: (10) [1, 2, 3, 3, 6, 8, 15, 17, 22, 55]