C中数组的递归函数

时间:2013-12-14 18:34:19

标签: c arrays recursion quicksort

我正在尝试在C中实现quicksort。

我之前在Python中已经完成了,但我是C的新手并试用了(请不要建议我只使用qsort()!)

我不明白的是,由于C不以与Python相同的方式处理数组,即它不能将它们传递给函数并从函数返回它们,所以只能将指针传递给一个(或者更确切地说,内存的开始 - 如何在递归函数中使用数组?

如果我的第一次通话需要float array[],请选择一个支点,然后对其进行排序。然后,如何连续调用下部和上部分区,并将它们粘合在一起?!

除非我弄错了,否则胶合在一起需要迭代,因为你无法分配到数组。但我们不能这样做,因为我们不知道每次调用需要多少内存 - 并且空间需要不同,因为我们仍然需要更高的值(在之前的调用中)......

我已经尝试过代码,我已经尝试过笔和纸,我只是无法完成这项工作 - 我从概念上理解递归(实际上,在Python中),我只是看不出如何在C中做到这一点我希望有一些我不知道的功能或语法。

感激不尽。

3 个答案:

答案 0 :(得分:0)

据我所知,C中Quicksort算法的大多数实现都会对给定数组进行排序 “in-situ”,并且不返回 new 排序数组。

这里显示了一个非常简单的实现,可能对理解该方法很有用:

正如您所看到的,该函数只是通过修改后的begin / end传递相同的数组 递归调用函数的索引。 传递给函数时,数组衰减成第一个元素的指针, 因此所有递归调用的函数都在(部分)上运行 相同的原始阵列。

其他实现可能会通过迭代或尾递归替换递归, 例如,参见

与现实世界的实施有关。

答案 1 :(得分:0)

使用变量句柄访问Python变量,允许Python通过了解变量的大小和数据类型来管理变量,以及变量是否在范围内或者是否在使用中以用于垃圾收集。在C源代码中,变量表示实际的内存位置。

Python中的数组变量是Python存储在内存中的数组的句柄,以及有关数组的信息,例如其大小(元素数),数组中存储的数据类型等。在C中数组变量基本上是指向包含数组元素的某个内存位置的常量指针。但是,没有与阵列一起存储的管理数据。数组内存位置中唯一的东西是数组元素的数据。编译C源代码后,有关数组大小,数据类型等的信息将丢失,并且在运行时不可用。

在Python中,您可以剪切和拼接并复制数组和数组片段,因为有关该数组的信息在运行时可用。在C语言中它并不那么简单,因为在编译源代码之后,有关数组的信息不可用。

广义qsort()函数的设计者面临的问题是它必须有一个允许函数与各种数组一起使用的接口。由于有关数组的信息在运行时无法使用C,程序员必须要求提供使qsort()函数适用于各种数组所需的最少信息。

程序员需要知道的是以下基本信息:(1)数组的起始位置,(2)数组中每个元素的大小,(3)数组中有多少个元素,以及(4)用于确定整理顺序以确定数组中两个元素顺序的比较函数是什么。

数组已就地排序。这意味着您将数组传递给qsort()函数,并且当qsort()返回时,数组的元素已经被排序。通过选择两个元素,将它们与提供的比较函数进行比较,然后在需要时交换两个数组元素来完成此排序。请记住,在C中,数组基本上是指向内存区域的常量指针。因此,提供了qsort()函数,该函数在数组开始的地址,并且调用者期望在qsort()返回时对从该内存位置开始的数组进行排序。

由于比较函数由qsort()的用户提供,因此编写比较函数的人知道数组元素的外观。程序员在调用比较函数时使用qsort()函数提供的指针来访问两个数组元素,并决定这两个元素的顺序,返回指示在整理顺序中哪个较低的指示。

然而,数组元素的交换需要使用一个临时数据区,当写入时不知道数组元素的大小时,它会回到qsort()函数的问题。所以交换通常一次完成一个字节。

由于C的内存模型导致的所有各种约束的最终结果是qsort()函数将通过从数组的开头指定数组索引或数组偏移量来使用递归。因此,qsort()函数通过指定子节的开始和结束索引来对数组的子节执行排序。在递归函数调用期间发生的变化只是索引值。

答案 2 :(得分:0)

" C编程语言"有一个qsort的实现。我将直接复制并粘贴代码:

void qsort(int v[], int left, int right) {
    int i, last;
    void swap(int v[], int i, int j);
    int test = 100;

    if (left >= right)
        return;
    swap(v, left, (left+right)/2);
    last = left;
    for(i = left+1; i <= right; i++)
        if (v[i] < v[left])
        swap(v, ++last, i);
    swap(v, left, last);
    qsort(v, left, last-1);
    qsort(v, last+1, right);
}

此处的关键是您使用要处理的int leftint right指定数组的左右边界。这就是你如何处理&#34;下部和上部分区,并将它们粘合在一起&#34;你感到困惑的一部分。

您最初使用qsort致电qsort(array,0,length-1),其中lengtharray中元素的数量。