C中的快速排序递归函数-不适用于大量元素

时间:2018-10-19 14:08:07

标签: c function recursion quicksort

此功能是否正确编写?

当我尝试使用数组中的大量元素(例如1000)运行函数时,似乎出现了问题。

然后它似乎停止了。

int quick_sort(int n, int tablica[],int b, int a)
    {   
        if(a==n-1 || n==0) return;
        if(b==n-1) 
        {
            b=0;
            a++;        
        }

        if(tablica[b]>tablica[b+1])
        {
            bufor=tablica[b];
            tablica[b]=tablica[b+1];
            tablica[b+1]=bufor;
        }
        b++;
        return quick_sort(n,tablica,b,a);
    }

1 个答案:

答案 0 :(得分:0)

除非小数组未按特定方式进行排序,否则以上代码即使对于小数组也不起作用。它将一个元素与下一个元素进行比较。如果将数组说为{4,3,8,7,1},则排序将失败,因为它没有将1推入数组开头的机制。

对于较大的数组,有太多的递归,并且程序达到堆栈限制,并且仅会失败。

您可以在快速排序中使用递归,但是必须检查递归的数量。例如,对于大小为1000的数组,您不需要递归超过1000。示例:

void swap(int* a, int* b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

void quicksort(int arr[], int low, int high)
{
    if(low < high)
    {
        int pivot = arr[high];    
        int i = (low - 1);  
        for(int j = low; j <= high - 1; j++)
        {
            if(arr[j] <= pivot)
            {
                i++;    
                swap(&arr[i], &arr[j]);
            }
        }
        swap(&arr[i + 1], &arr[high]);
        int pi = i + 1;

        quicksort(arr, low, pi - 1);
        quicksort(arr, pi + 1, high);
    }
}

int main()
{
    int arr[] = { 7,3,6,1,4,8,9,2 };
    int arrsize = sizeof(arr) / sizeof(*arr);
    quicksort(arr, 0, arrsize - 1);
    for(int i = 0; i < arrsize; i++)
        printf("%d\n", arr[i]);
    return 0;
}