Quicksort - 没有用于调用c ++的匹配函数

时间:2016-10-18 08:10:07

标签: c++ sorting quicksort

我试图使用指针创建一个快速排序算法,但我遇到了麻烦

行:int* pivot = partition(start, stop);导致错误"没有匹配函数来调用分区"。代码可能存在其他问题,但这是不允许我运行的问题。 任何帮助将不胜感激。

void quickSort(int* start, int* stop) {
    if (stop - start <= 1) return;
    int* pivot = partition(start, stop);
    quickSort(start, pivot);
    quickSort(pivot + 1, stop);
}

int partition(int* start, int* stop) {
    int* pivot = stop - 1;
    int* i = start;
    int* j = stop - 1;
    for (;;) {
        while (i < pivot && i < stop) ++i;
        while (j >= pivot && j > start) --j;
        if (*i >= *j) break;
        swap(i, j);
    }
    swap(*(stop - 1), *i);
    return *i;
}

3 个答案:

答案 0 :(得分:3)

编译器一次完成所有工作。因此,当它在实际声明(或定义)之前看到“分区”的使用时,它不知道如何解释该符号。所以它会出错。

简单的解决方案是只转发声明partition函数。在<{1>}函数

上面添加以上行。

quickSort

这基本上对编译器说的是,“嘿,当你在编译后看到 /* forward declare */ int partition(int* start, int* stop); 令牌时,不要惊慌失措,这是一个需要两个int指针参数的函数。它会稍后定义,链接器将负责解析它。“。

答案 1 :(得分:2)

要么声明上面的函数原型

_hasPendingChanges: function() {
    var oPendingChanges = this._oODataModel.getPendingChanges(),
        sValue = "MyEntitySetToIgnore",
        bReturn;

        var aPendingChanges = $.map(oPendingChanges, function(value, index) {
            return [index];
        });


        for (var i = 0; i < aPendingChanges.length; i++) {
            if (aPendingChanges.toString().startsWith(sValue)) {
                bReturn = this.DoSomeSpecialThingsHere();
            } else {
                return true;
            }

            if (bReturn) {
                return true;
            }
        }

        return false;
    },

int partition(int *, int *);

之上定义partition()

答案 2 :(得分:0)

主要问题是,数据透视不能是int *,而只是简单的int,因为您要比较数组值,而不是数组引用。你必须在partition函数中更改代码,以显示类似:

int pivot = *(stop - 1);
...
if (i < stop && *i <= pivot) ... /* [ NOTE 1 ] */
if (j >= start && *j >= pivot) ... /* [ NOTE 1 ] */

注1

在比较之前,您必须首先检查阵列位置,因为您可以比较范围之外的元素。使用&&运算符时要小心 ,并仔细检查检查子句的顺序(在布尔代数中这并不重要,因为AND运算符是可交换的,但不是C / C ++,你必须首先检查数组边界,然后检查数组元素,否则你将遇到麻烦)

注2

你必须复制pivot,因为它可以作为一些比较的结果移动,并且你将在每次分区调用中完成使用不同的枢轴。最好的方法是从可能的外部函数调用获得枢轴(因为枢轴的选择是在算法中打开)并将值直接传递给分区(好吧,但这与问题无关)

当然,partition()缺少前瞻性声明的问题是其他答案中已经描述的另一个问题。 C ++ 要求程序中使用的所有内容在 >之前正确声明。