首先我们在复习一下快排的递归写法,这里所用的方法为前后指针法:
代码如下:
void QuickSort(int*a ,int begin,int end)
{
int prev=begin;
int key=begin;
int cur=begin+1;
while(a[prev]<a[key] && ++prev!=cur)
{
Swap(&a[cur],&a[prev]);
}
cur++;
key=prev;
QuickSort(a, begin, key - 1);
QuickSort(a, key + 1, end);
}
但是递归的缺陷是如果递归的层次太深,很容易就会导致栈溢出,所以接下来我们就利用栈的知识来优化一下代码:
void QuickSortNonR(int* a, int begin, int end)
{
ST st;
StackInit(&st);
StackPush(&st, end);
StackPush(&st, begin);
while (!StackEmpty(&st))
{
int left = StackTop(&st);
StackPop(&st);
int right = StackTop(&st);
StackPop(&st);
int key = PartSort3(a, left, right);
// [left, key-1] key [key+1, right]
if (key + 1 < right)
{
StackPush(&st, right);
StackPush(&st,key + 1);
}
if (left < key - 1)
{
StackPush(&st, key - 1);
StackPush(&st, left);
}
}
StackDestroy(&st);
}