我在实现快速排序以对字符串数组进行排序时遇到问题。我对c ++也比较陌生,所以仍然在那里遇到一些问题。现在我的代码正确读入并创建了一个字符串数组,但是当我尝试使用我的快速排序算法时遇到了问题。我遇到的第一个问题是我认为递归并不会停止。快速排序运行一段时间后,我遇到了分段错误。
代码(修改):
#include "MyParser.h"
#include <iostream>
#include <fstream>
#include <string>
void resize(string*& words, int size)
{
string* newArray = new string[size*2];
for (int i = 0; (i < size)&&(i<size*2); i++)
newArray[i] = words[i];
for (int i = size; i < size*2; i++)
newArray[i] = "";
delete[] words;
words = newArray;
}
void partitionArray(string*& words, int& left, int& right, int pi)
{
int i = left;
int j = right;
string tmp;
string pivot = words[pi];
while (i < j) {
string str1 = words[i];
string str2 = words[j];
while ((str1.compare(pivot) < 0) && (i < right))
i++;
while ((str2.compare(pivot) >= 0) && (j > left))
j--;
if (i <= j)
{
tmp = words[i];
words[i] = words[j];
words[j] = tmp;
i++;
j--;
}
};
}
void quickSort(string*& words, int left, int right)
{
int i = left;
int j = right;
string tmp;
string pivot = words[(left + right) / 2];
/* partition */
int pivotIndex = (left + right) / 2;
pivotIndex = partitionArray(words, 0, right, pivotIndex);
cout << "start recursion" << endl;
/* recursion */
if (left < j)
quickSort(words, left, j);
if (i < right)
quickSort(words, i, right);
}
int main()
{
// define file reader
ofstream outData;
outData.open("logData.txt");
Parser* myParser = new Parser("testData.txt");
int sizeOfArray = 500;
string* words = new string[sizeOfArray];
int index = 0;
while(myParser->hasTokens())
{
if (index >= sizeOfArray)
{
resize(words, sizeOfArray);
sizeOfArray = sizeOfArray*2;
}
string currentWord = myParser->nextToken();
if (currentWord != "")
{
words[index] = currentWord;
index++;
}
}
int lastWordInArrayIndex = index;
quickSort(words, 0, lastWordInArrayIndex);
return 0;
}
对此的任何帮助将不胜感激!
改性
现在它将正确排序以下11个元素: adfgh btyui dfghj eerty fqwre kyuio verty wwert yrtyu zbsdf zsdfg
但是当尝试对以下解析的文本进行排序时,不使用所有分隔符,但更糟糕的是“喜欢这个”,使用单个连字符或带有撇号的单词,如“他们”,它不会终止:
争吵后三天,斯蒂芬·阿尔卡季耶维奇亲王 Oblonsky - Stiva,他在时尚界被称为 - 他平常一小时醒来,也就是八点钟 早上,不是在他妻子的卧室,而是在皮革覆盖的 沙发在他的书房里。他转过身来,精心照料 在弹性沙发上的人,好像他会沉入一个长长的沙发 再次入睡;他大力拥抱另一边的枕头 把脸埋在里面;但他立刻跳了起来,坐了起来 在沙发上,睁开眼睛。
“是的,是的,现在怎么样?”他想,超越了他的梦想。 “现在,怎么回事?确定一下!阿拉宾正在吃饭 达姆施塔特;不,不是达姆施塔特,而是美国人。对,但是 然后,达姆施塔特在美国。是的,阿拉宾正在吃晚饭 在玻璃桌上,桌子上唱着,Il mio tesoro - 不是Il mio tesoro虽然,但更好的东西,有一些 桌子上的小滗水器,他们也是女性,“他 记住了。
再次对此问题的任何帮助将不胜感激!
答案 0 :(得分:0)
你的quickSort
函数确实会无限递归:
void quickSort(string*& words, int left, int right)
{
int i = left;
int j = right;
...
if (left < j)
quickSort(words, left, j);
if (i < right)
quickSort(words, i, right);
}
i
,j
,left
和right
未在该函数中的任何位置进行修改,因此如果left < right
函数将以递归方式调用参数一次又一次。