使用quicksort对字符串进行排序

时间:2011-11-25 19:42:44

标签: c++ string quicksort

我在实现快速排序以对字符串数组进行排序时遇到问题。我对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虽然,但更好的东西,有一些 桌子上的小滗水器,他们也是女性,“他 记住了。

再次对此问题的任何帮助将不胜感激!

1 个答案:

答案 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);
}

ijleftright未在该函数中的任何位置进行修改,因此如果left < right函数将以递归方式调用参数一次又一次。