算法习题
著名的快速排序算法对于计算机专业的学生已不陌生,算法是递归实现的。请按照快速排序的思想,设计一个非递归的(即迭代的)快速排序算法。(提示:可利用栈)。
解:
1)用a[size]存待排序数组,stack[M]存下标。
2)开始时stack[M]存入待排序数组a[size]的起始下标和终止下标。
3)从stack[]中取出一对起始下标和终止下标,在这两个下标区间内依次读入a[]值,小于枢轴数值x的一律通过交换放在a[]前端。这样就很自然地将数组a[] 分成了小于x的一个子段和大于等于x的一个子段。
4)两个子段中,有任何一段长度大于1,就将其起始和终止下标压栈。
5)只要栈不空就一直执行上述操作3)4),最终就能完成一个非递归的(即迭代的)快速排序算法
代码:
void qSort(inta[], int size)
{
int stack[M];
int top=-1;
stack[++top] = 0;
stack[++top] = size-1;
while (top>0)
{
int end = stack[top--];
int start = stack[top--];
int x = a[end];
int i = start-1;
int j = start;
for (int j = start; j < end; j++)
{
if (a[j] < x)
{
i++;
exch(a[i], a[j]);
}
}
swap(a[i+1], a[end]);
if (start < i)
{
stack[++top]=start;
stack[++top]=i;
}
if (i+2 < end)
{
stack[++top] = i+2;
stack[++top] = end;
}
}
}