Прежде всего, я хочу сказать, что это домашнее задание.Быстросортировать, используя двоичный файл с int с дубликатами. Возникли проблемы с рекурсией
Часто у нас будут задания, на которые я отправлю вопросы после того, как мы закончим его, и я хотел бы продолжить работу с ним, чтобы улучшить свои способности, но в этом случае я просто в тупике!
Нам было поручено реализовать quicksort с использованием двоичного файла, используя только команды file.seek, file.read и file.write. Это двоичный файл целых чисел.
Проблемы я имею рекурсию часть, вызывая функцию на «поддерева» из поворота. Я слежу за алгоритмом, изложенным на этом сайте: http://xoax.net/comp_sci/crs/algorithms/lessons/Lesson4/ и использовал пример кода в качестве псевдокода для реализации моего двоичного файла.
Вот мой код:
//Algorithm and code example used:
void manage(fstream & file , int lindex , int fSize){
//Chunks of 1 or 0 do not need sorting
if(fSize <= 1)
return;
//Choose point in file as "pivot." Pivot is a value.
//pp is the index of "pivot"
int pp = (rand() % fSize) + lindex;
file.seekp(pp * sizeof(int) , file.beg);
int pivot;
file.read((char*)&pivot , sizeof(int));
//Choose "indices" to be swapped. These will be used in seekp
int leftIndex = lindex;
int rightIndex = fSize - 1;
//Swap val , swap val, temp storage, swap index 1 , swap index 2
int leftSwap , rightSwap , temp , tempI1 , tempI2 = 0;
//Dummy indecies to help with tracking partitions.
int dumL = leftIndex;
int dumR = rightIndex;
while(dumL < dumR){
//Move to left index from the file beginning.
file.seekp(dumL * sizeof(int) , file.beg);
do{
tempI1 = file.tellp()/sizeof(int);
dumL = tempI1;
file.read((char*)&temp , sizeof(int));
}
while(temp < pivot);
leftSwap = temp;
//Move to right index.
file.seekp(dumR * sizeof(int) , file.beg);
int n = 1;
do{
tempI2 = file.tellp()/sizeof(int);
dumR = tempI2;
file.read((char*)&temp , sizeof(int));
file.seekp((rightIndex - n) * sizeof(int) , file.beg);
n++;
}
while(temp > pivot);
rightSwap = temp;
//Swap values
int hold = 0;
if(leftSwap == rightSwap && rightSwap == pivot)
break;
file.seekp(tempI1 * sizeof(int) , file.beg);
file.read((char*)&hold , sizeof(int));
file.seekp(tempI1 * sizeof(int) , file.beg);
file.write((char*)&rightSwap , sizeof(int));
file.seekp(tempI2 * sizeof(int) , file.beg);
file.write((char*)&leftSwap , sizeof(int));
}
cout << "pp: " << pp << endl;
cout << "dumL: " << dumL << endl;
cout << "dumR: " << dumR << endl << endl;
//cout << "Lmanage: \n\t Lindex: 0\n\tSize: " << dumL << endl;
manage(file , 0 , dumL);
//cout << "Rmanage: \n\t Lindex: " << dumL + 1 << "\n\tSize: " << fSize - dumL - 1 << endl;
manage(file , dumL + 1 , fSize - (dumL - leftIndex) - 1);
}
void quicksort(fstream & file , int iSize){
srand((unsigned int) time(0));
manage(file , 0 , iSize);
}
int main(int argc, char* argv[]){
if(argc != 2){
cout << "Invalid number of arguments.\n";
return -1;
}
fstream file;
int x = 0;
file.open(argv[1] , ios::binary | ios::out | ios::in);
//Calculate number of ints in file.
file.seekg(0 , file.end);
int size = file.tellg()/sizeof(int);
cout << "size: " << size << endl;
quicksort(file , size);
return 0;
}
"Арг" представляет собой двоичный файл, содержащий 100 целых чисел, с возможными дубликатами. Проблема в том, что он, кажется, сортирует первый 1/4, но индексирование смешивается, а аргумент «размер» отрицателен.
Edit: Добавлен мой основной и обновляется с изменениями от комментариев.
Для начала, остановки высева вашего ГСЧА с каждой рекурсией слоем. 'srand()' должен быть в вашем запуске программы; нигде более. Во-вторых, распространенной ошибкой в быстрых реализациях сортировки является отказ SKIP в слоте поворота после его размещения при переходе в подпоследовательности. Посмотрите на свой код * очень внимательно, чтобы убедиться, что вы не совершаете ту же ошибку. Стержень не должен включаться в * либо * подпоследовательностей, которые повторяются. – WhozCraig
Кроме того, не передавайте имя файла в 'manage()'; передайте открытую ссылку 'fstream'. Вам не нужны все эти дескрипторы файлов, и у вас возникнут проблемы с совместным использованием. – WhozCraig
Я думал, что сделал это, и сделал изначально, но в итоге я получил большую ошибку, которую я не понял. Я предположил, что мне не разрешено передавать открытые файлы в качестве аргумента. – Joshua