借助栈来实现
int partition(int *a, int left, int right)
{
int check_value = a[right];
int i, j = left - 1;
for(i = left;i < right; i++)
{
if(a[i] < check_value)
{
j++;
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
j++;
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
return j;
}
void qsort(int *a, int left, int right)
{
if( left < right)
{
int p = partition(a, left, right);
qsort(a, left, p -1);
qsort(a, p + 1, right);
}
}
struct record
{
int left;
int right;
int middle;
int status;
};
void qsort_nonrecursive(int *a, int left, int right)
{
struct record stack[1000];
int top = -1;
int p = left;
int q = right;
int status = 0;
int middle;
while( 1)
{
printf("p:%d, q:%d, top:%d\n", p, q, top);
if(p >= q)
{
if( top == -1)
{
break;
}
p = stack[top].left;
q = stack[top].right;
middle = stack[top].middle;
status = stack[top].status;
top--;
}
else if( status == 0)
{
middle = partition(a, p, q);
top++;
stack[top].left = p;
stack[top].right = q;
stack[top].middle = middle;
stack[top].status = 1;
q = middle -1;
status = 0;
}
else if( status == 1)
{
top++;
stack[top].left = p;
stack[top].right = q;
stack[top].middle = middle;
stack[top].status = 2;
p = middle +1;
status = 0;
}
else if( status == 2)
{
if( top == -1)
{
break;
}
p = stack[top].left;
q = stack[top].right;
middle = stack[top].middle;
status = stack[top].status;
top--;
}
}
}
int main(void)
{
int a[] = {100, 2, 44, 9, 1, 422, 21, 3};
qsort_nonrecursive(a, 0, sizeof(a)/sizeof(a[0]) -1 );
//qsort(a, 0, sizeof(a)/sizeof(a[0]) -1 );
return 0;
}
参考: