这将是一个愚蠢的问题,但我无法理解调用递归的顺序。例如在quickSort算法中,有人可以更详细地解释它是如何工作的。我将发布alghorithm
void quicksort(int a[],int low,int high)
{
int pivot;
if(high>low)
{
pivot=partition(a,low,high);
quicksort(a,low,pivot-1);
quicksort(a,pivot+1,high);
}
}
int partition(int a[],int low,int high)
{
int left,right;
int pivot_item;
int pivot=low;
left=low;
pivot_item=a[low];
right=high;
while(left<right)
{
while(a[left]<=pivot_item){
left++;
}
while(a[right]>pivot_item){
right--;
}
if(left<right){
swap(a,left,right);
}
}
a[low]=a[right];
a[right]=pivot_item;
return right;
}
int main()
{
a[10]={5,1,13,14,7,6,19,10,9,23};
int i;
printf("before\n");
for(i=0;i<10;i++)
{
printf("%i,",a[i]);
}
quicksort(a,0,10);
printf("\n");
printf("After sort:\n");
for(i=0;i<10;i++)
{
printf("%i,",a[i]);
}
return 0;
}
所以它用数组调用函数a,low为0,high为10,然后变量从分区函数中分配一些值,然后再次调用quicksort,其中high为pivot-1,并且一直持续到高是&lt; =低,这就是我的混乱局面,对于快速排序的第二次调用是如何处理的,因为高位正在变得等于低位,而且如果我认为那就是错误。
答案 0 :(得分:1)
整个递归点是你甚至不必考虑该方法所采用的整个调用序列。你只需要考虑递归关系。
您应该问的问题是:
基本案例是否有效?
quicksort
不大于(等于)low
时,high
是否在high
和low
之间正确对数组进行排序? 递归关系是否有效?
quicksort
的其他来电正常工作,low
是否在high
和quicksort
之间对数组进行了正确排序?quicksort(a,low,pivot-1);
正确地在a
和low
之间对数组pivot - 1
进行排序。它可能会帮助您将其视为对完全不同的函数的调用,它完全对数组进行排序。如果这两个都有效,那么你的递归函数应该可行。这适用于所有递归函数。