快速排序

107 阅读1分钟
 function main(arr)
{ 
    const quickSort(q, l, r) => { 
        // 递归终止条件
        if (l <= r) return; 
        // 处理问题逻辑主体 
        let i = l - 1;
        let j = r + 1; 
        let x = q[l]; 
        while (i < j) { 
            do { i++ } while(q[i] < x); (1)
            do { j-- } while(q[j] > x);
            if ( i < j) { 
                [q[i], q[j]] = [q[j], q[i]]; 
            }
        } 
        // 递归处理子问题 
        quickSort(q, l, j); 
        quickSort(q, j+1, r); 
    }; 
    quickSort(arr, 0, arr.length - 1);
}

    

注意:
    1. 此处一定要用do.. while,这样能保证循环不会卡死。
如果用while() {。。。}, 如果q[i]q[j]的值都跟x相同,循环递归无法进行下去,会一直循环一段数组,
没有办法排序。(nums = [5,1,1,2,0,0])

    2.以j划分,x不能选q[r],同理以i划分,x不能选q[l],因为容易出现一边全集一边空集的情况
    3. do { i++ } while(q[i] < x) 不能是q[i] <= x,如果全相同, i越界