递归调用序列

时间:2013-12-26 18:23:49

标签: c quicksort

这将是一个愚蠢的问题,但我无法理解调用递归的顺序。例如在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; =低,这就是我的混乱局面,对于快速排序的第二次调用是如何处理的,因为高位正在变得等于低位,而且如果我认为那就是错误。

1 个答案:

答案 0 :(得分:1)

整个递归点是你甚至不必考虑该方法所采用的整个调用序列。你只需要考虑递归关系。

您应该问的问题是:

  1. 基本案例是否有效?

    • quicksort不大于(等于)low时,high是否在highlow之间正确对数组进行排序?
  2. 递归关系是否有效?

    • 如果您认为对quicksort的其他来电正常工作,low是否在highquicksort之间对数组进行了正确排序?
    • 你实际上不必考虑他们采取的路径。现在,假设quicksort(a,low,pivot-1);正确地在alow之间对数组pivot - 1进行排序。它可能会帮助您将其视为对完全不同的函数的调用,它完全对数组进行排序。
  3. 如果这两个都有效,那么你的递归函数应该可行。这适用于所有递归函数。