【发布时间】:2014-05-12 19:47:28
【问题描述】:
我正在尝试为快速排序算法编写递归程序。到目前为止,这是我的代码:
void QuickSort(int *array, int first, int last){
int q;
if (first<last){
q = partition(array,first,last);
QuickSort(array,first,q-1);
QuickSort(array,q+1,last);
}
}
void partition(int *A, int p, int r){
int value = A[r];
i = p-1;
int tmp;
for (j = p; j<=r; j++){
if (A[j] <= value) {
i++;
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}
return(i);
}
int main(){
int numArray[8] = {30,15,11,40,75,80,70,60};
int i;
printf("Before sorting: \n");
for (i = 0; i<8; i++) printf("numArray[%d] = %d\n", i, numArray[i]);
int first = 0;
int last = sizeof(numArray)/sizeof(numArray[0]);
QuickSort(numArray,first,last-1);
printf("After sorting: \n");
for (i = 0; i<8; i++) printf("numArray[%d] = %d\n", i, numArray[i]);
}
我的问题是,当我运行它时,当我到达第一个递归调用时(就在分区之后),我陷入了无限循环。另外,我注意到递归调用是在 A[0] - A[5] 的数组值上运行的,即使它应该在 A[0]-A[3] 上。我并不期待一个完整的答案,但也许关于程序为什么会陷入无限状态的提示会非常有帮助。
【问题讨论】:
-
代码有很多错误导致无法编译。一旦这些被修复,代码对我有用。一个有趣的解决方法是将
partition更改为返回int而不是void -
我的评论实际上是从头开始遍历整个数组,而枢轴实际上是数组中的最后一个数字。我明白你在说什么,但我们(作为我大学的算法课)只是从头开始工作,而不是像你建议的那样从数组的两端开始
-
我的意思是说“代码”而不是上面的“评论”
-
@user3342662 - 不要编辑帖子的重要原始内容。当其他人试图解决一个问题时,它会混淆事情,然后突然间你所说的问题已经改变或消除了。
-
@ryyker 我所做的唯一更改是在 main() 函数中声明“int i”,因为下面的一位用户说它未声明,而在我的程序中我实际上将“i”声明为一个全局变量。否则,代码保持不变。所以,作为对你的评论的回应,我真的不知道大惊小怪是什么。
标签: c algorithm recursion quicksort