快速排序涉及2类处理,
一个是【站队partition】,一个是【快排的坐标遍历】
整个快速排序过程可以理解为:先对整理做简单的排序,然后把整理分隔成2个部分,再对部分进行简单排序,以此类推。
整个过程可以理解为是一个二叉树的中序遍历,每个节点代表一次【站队(partition)】
既然是满二叉树的遍历,我们有2种算法设计思路,
一个是利用递归对树进行遍历,
另一种就是利用栈对树进行遍历。
每访问一个节点就进行一次站队
--------------------------------------------
对树进行中序遍历的递归实现:
对根节点站队
遍历左子树,遍历右子树
利用栈对树进行中序遍历:
对根节点进行站队
-------》左子树根节点站队
-------》发现左子树没遍历完,右子树进栈,否则直接站队
-------》左子树的左分支站队,
-------》左子树的左分支 遍历完,左子树的右分枝站队
--------》左子树的右分枝 遍历完,退栈,对退出的节点进行遍历。。。。。。
因此利用栈对树的遍历可以,理解为对根节点的遍历。
站队算法的JAVA实现
private
static
int
partout(
int
[] x,
int
i,
int
j) {
int
leader,status =1, tmp;
leader = x[i];
while
(i < j){
while
(i < j ){
if
(status == 1 && leader<=x[j]){ j--;}
//右到左
else
if
(status == 2 && leader>=x[i] ){i++;}
//左-->右
else
{
break
;}
}
//开始做交换
if
(status == 1 ){
tmp = x[j];x[j] = x[i] ;x[i] = tmp ;
status =2;
}
else
if
(status == 2 ){
tmp = x[i];x[i] = x[j] ;x[j] = tmp ;
status = 1;
}
}
return
i;
}
}