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


