(1)思路
继续使用adjust进行划分,如果其中的元素不止1个,那么将下标的开始和结束入栈,否则不入栈
(2)代码
private void quickSortNR(int[] a, int begin, int end)
{
if(begin<end)
{
Stack<Integer> stack = new Stack<Integer>();
int mid = adjustNR(a,begin,end);
if(begin<mid-1) //左边区间不止1个元素
{
stack.push(begin); //下标起点入栈
stack.push(mid-1); //下标终点入栈
}
if(end>mid+1) //右边区间不止一个元素
{
stack.push(mid+1);
stack.push(end);
}
while(!stack.isEmpty())
{
int tail = stack.pop(); //因为终点是后保存的,所以终点先出栈
int head = stack.pop();
int midx = adjustNR(a, head, tail);
if(head<midx-1)
{
stack.push(head);
stack.push(midx-1);
}
if(tail>midx+1)
{
stack.push(midx+1);
stack.push(tail);
}
}
}
}
private int adjustNR(int[] a, int begin, int end)
{
int flag = a[begin];
while(begin<end)
{
while(begin<end && a[end]>=flag)
end--;
if(begin<end)
a[begin] = a[end];
while(begin<end && a[begin]<=flag)
begin++;
if(begin<end)
a[end] = a[begin];
}
a[begin] = flag;
return begin;
}
(3)测试
int[] a = {16, 105, 3, 31, 61, 50, 61, 80, 78, 4};
quickSortNR(a,0,a.length-1);
for(int x:a)
System.out.print(x+" ");
结果为:
3 4 16 31 50 61 61 78 80 105