您现在的位置:首页 >> 前端 >> 内容

快排的递归与非递归实现(二)

时间:2017/4/7 9:25:00 点击:

  核心提示:快排的递归与非递归实现(二):我们首先将之前快排的代码进行一个拆解,将分段函数独立出来,主要是为了我们可以很方便的理解递归的过程,从而通过堆栈来模拟递归,实现快速排序的非递归实现。拆解出partiti...

快排的递归与非递归实现(二):我们首先将之前快排的代码进行一个拆解,将分段函数独立出来,主要是为了我们可以很方便的理解递归的过程,从而通过堆栈来模拟递归,实现快速排序的非递归实现。
拆解出partition函数:

 function partition(arr, start, end) {
        var flag = arr[start];
        while (start < end) {
            while (start < end && arr[end] >= flag)
                end--;
            arr[start] = arr[end];
            while (start < end && arr[start] <= flag)
                start++;
            arr[end] = arr[start];
        }
        arr[start] = flag; 
        return start;
    }

    function quickSort(arr, start, end) {
        var index;
        if (end > start) {
            index = partition(arr, start, end);
            quickSort(arr, start, index - 1);
            quickSort(arr, index + 1, end);
        }
    }

调用quickSort(arr, 0, arr.length - 1);即可对arr进行排序。
我们发现,递归的过程,其实主要是通过partition对start,index,end进行递归使用。那么,现在我们可以利用堆栈,保存对start、index、end的引用,从而实现递归的效果。

1、定义一个数组,先将end,start入栈(考虑出栈时顺序,end先入)。
2、只要栈不为空(这里即为数组长度不为0),进行出栈操作,即另left = start,right =end,然后调用partition,返回index,有了index我们即可进行分段,然后两段依次入栈。
3、重复上述步骤,即可完成a 的排序。

这里一个需要注意的点,就是入栈出栈的操作顺序,务必要符合我们要求。

贴代码:

 function partition(arr, start, end) {
        var flag = arr[start];
        while (start < end) {
            while (start < end && arr[end] >= flag)
                end--;
            arr[start] = arr[end];
            while (start < end && arr[start] <= flag)
                start++;
            arr[end] = arr[start];
        }
        arr[start] = flag;
        return start;
    }

    function quickSort(arr, start, end) {
        var stack = [],
            left, right;
        if (start < end) {
            stack.push(end);
            stack.push(start);
            while (stack.length != 0) {
                left = stack.pop();
                right = stack.pop();
                index = partition(arr, left, right);
                if (left < index - 1) {
                    stack.push(index - 1);
                    stack.push(left);
                }
                if (right > index + 1) {
                    stack.push(right);
                    stack.push(index + 1);
                }
            }
        }
    }

作者:网络 来源:不详