2016-10-18 3 views
0

Im пытается создать быстрый алгоритм сортировки с использованием указателей и имеет но неприятностиQuicksort - Нет функция соответствия для вызова C++

Линия: 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

Компилятор выполняет всю свою работу за один проход. Поэтому, когда он видит использование «раздела», прежде чем он будет объявлен (или определен), он не знает, как интерпретировать этот символ. Таким образом, это приводит к ошибке.

Простым решением является просто переслать объявление partition. Добавьте эту строку вышеquickSort функция.

/* forward declare */ 
int partition(int* start, int* stop); 

То, что это в основном говорит компилятор, «эй, когда вы видите partition маркер позже в компиляции, не урод, это функция, которая принимает два ИНТА указатель Params. Он будет определен позже, и компоновщик позаботится о его разрешении ».

2

Либо объявить прототип функции выше

int partition(int *, int *); 

или

определяют partition() выше quickSort()

0

Основная проблема заключается в том, что стержень не должен быть int *, а просто обычный int, как и вы сравнение значений массива, а не ссылок на массивы. Вы должны изменить свой код в partition функции, чтобы показать что-то вроде:

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

Примечания 1

вы должны проверить в первую очередь для позиции массива, прежде чем сравнивать, так как вы можете привести сравнивающие элементы, которые находятся за пределами диапазон. Be most осторожно при использовании оператора && и дважды проверяйте порядок, в котором вы проверяете предложения (в булевой алгебре это не важно, поскольку оператор И является коммутативным, но не в C/C++, вам нужно сначала проверить массив границы, то элемент массива, или вы столкнетесь с проблемами)

Примечание 2

вы должны скопировать кроме pivot, так как он может быть перемещен в результате какой-то Comparation, и вы закончите с использованием разные опорные точки в каждом вызове для разделения. Лучшее должно быть то, что вы получаете стержень (как выбор поворота является то, что открыто в алгоритме) от возможного вызова внешней функции и передать значение непосредственно к перегородке (хорошо, но это не связано с проблемой)

Конечно, проблема пропущенного прямого объявления partition() - это еще одно, что уже описано в других ответах. C++ требует, что все, что используется в программе, правильно объявлено до его использования.