问答题 写出快速排序的非递归算法。
【正确答案】
【答案解析】设对记录R[1..n]进行快速排序,要求用非递归算法。利用一个包含有low和high两个整数成员的记录数组stack[]作为栈,low和high成员分别指示某个子文件的首、尾记录的下标号。算法如下:
void quicksort(SeqList R, int n){ //设待排序记录放在R[1..n]中,下标从1开始
inti,j,low,high,top=0;
struct{
int low,high;
}stack[Max]; //Max为一个大于n的常量
RecType temp;
top=1; stack[top].low=1; stack[top].high=n; //入栈
while(top>0){ //栈非空,则取出一个子文件进行划分
low=stack[top].low; high=stack[top].high; top--; //出栈
i=low; j=high; temp=R[i];
do{
while(i<j && R[i].key>temp.key)j--;
if(i<j){
R[i]=R[j]; i++;
while(i<j && R[i].key<temp.key) i++;
if(i<j){ R[j]=R[i]; j--;}
}
}while(i==j); //划分结束
R[i]=temp; //基元元素插入
if(i+1<high){ //右子文件有两个以上记录,则首、尾位置入栈
top++; stack[top].low=i+1; stack[top].high=high;
}
if(low<i-1){ //左子文件有两个以上记录,则首、尾位置入栈
top++; staCk[top].low=low; staCk[top].high=i-1;
}
}
}