我试图使用指针创建一个快速排序算法,但我遇到了麻烦
行: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;
}
答案 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 ] */
在比较之前,您必须首先检查阵列位置,因为您可以比较范围之外的元素。使用&&
运算符时要小心 ,并仔细检查检查子句的顺序(在布尔代数中这并不重要,因为AND运算符是可交换的,但不是C / C ++,你必须首先检查数组边界,然后检查数组元素,否则你将遇到麻烦)
你必须复制pivot
,因为它可以作为一些比较的结果移动,并且你将在每次分区调用中完成使用不同的枢轴。最好的方法是从可能的外部函数调用获得枢轴(因为枢轴的选择是在算法中打开)并将值直接传递给分区(好吧,但这与问题无关)
当然,partition()
缺少前瞻性声明的问题是其他答案中已经描述的另一个问题。 C ++ 要求程序中使用的所有内容在 >>之前正确声明。