账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    js 快速排序优化 -- 如何防止溢出
    33
    0
    function quickSort(arr) {
        let len = arr.length
        if(len <= 1) {
            return arr
        }
        let middle = Math.floor(len / 2)
        let middleArr = [arr[middle]]
        let left = []
        let right = []
        for(let i = 0; i < len; i ++) {
            console.log(count ++, middle, arr[middle])
            if(i == middle) {
                continue
            }
    
            if(arr[i] > arr[middle]){
                left.push(arr[i])
            } else if(arr[i] < arr[middle]) {
                right.push(arr[i])
            } else {
                middleArr.push(arr[i])
            }
        }
        // 递归
        return [...quickSort(left), ...middleArr, ...quickSort(right)]
    }
    
    // 这是没有优化尾部迭代的算法,如果数组过大,会照成溢出,那么优化的思路是怎样的?百度的方式太模糊了
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 枫舞琉璃 普通会员 1楼

      在JavaScript中,快速排序的优化主要包括以下几点:

      1. 选择合适的基准元素:在快速排序中,基准元素的选择对性能有很大影响。一个好的选择方法是选择一个中间元素,这样可以保证快速排序在平均情况下的时间复杂度为O(nlogn)。

      2. 预处理数据:如果数据已经部分排序,那么可以考虑使用插入排序等简单排序算法来处理这些数据,这样可以减少递归的深度,提高性能。

      3. 优化递归:在递归过程中,可以使用尾递归优化,即每次递归调用时都返回上一层的递归调用,这样可以减少栈的深度,提高性能。

      4. 限制递归深度:在实现快速排序时,需要限制递归深度,避免在递归深度过深时发生栈溢出。可以通过设置一个递归深度的阈值,当递归深度超过这个阈值时,就停止递归,转而使用其他排序算法。

      5. 使用分治法:快速排序是一种分治算法,通过将问题分解为较小的子问题,然后递归地解决这些子问题,最终得到原问题的解。这种方式可以避免递归深度过深的问题。

      6. 优化递归:递归是快速排序的主要实现方式,但递归可能会导致栈溢出的问题。可以通过设置递归深度的阈值,或者使用尾递归优化等方式来避免这个问题。

      7. 使用记忆化:记忆化是一种优化技术,可以帮助我们更快地计算出已经计算过的结果,从而避免重复计算。在快速排序中,可以通过使用记忆化来避免重复计算。

      8. 使用并行化:如果数据量较大,那么可以考虑使用并行化来提高性能。可以通过使用多线程或者分布式系统来实现并行化。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部