1

我试图让快速排序工作以按字母顺序对 7000 个字符串的数组进行排序,但我得到的只是一个空白输出文件。它适用于我的冒泡排序方法,但不适用于此方法。我确定这是一个明显的错误,但我无法确定它。

void ArrayStorage::quicksort(int first, int last, string list[])
{
        int middle, p, index;
    string temp, partition;
    if (first < last)
    {  
            middle = int(first + last)/2;
            temp = list[middle];
            list[middle] = list[first];
            list[first] = temp;
            partition = list[first];
            p = first;
            for (index = first + 1; index <= last; index++)
            {
                    if(list[index] < partition)
                    {
                            p = p + 1;
                            temp = list[index];
                            list[index] = list[p];
                            list[p] = temp;
                    }  
            }  
            temp = list[first];
            list[first] = list[p];
            list[p] = temp;
            quicksort(first, p - 1, list);
            quicksort(p + 1, last, list);
    }
}

我这样调用方法:

  quicksort(0,GetSize() -1,namesArray);
4

2 回答 2

4

How about using the built in quicksort?:

std::sort(&namesArray[0], &namesArray[GetSize()]);

于 2012-04-26T11:17:12.577 回答
1

好吧,快速排序的每个循环中的原则是使 temp 变量的位置小于它的所有元素都放在 temp 的左侧,而更大的元素放在右侧。所以这必须是一个循环包含向右迭代来搜索是否有任何大于 temp 的数字,反之亦然。如果有,则将当前内容放到另一侧,然后从另一侧迭代,直到列表的整体迭代。在循环之后,所有小于 temp 的元素都应该在左边,而更大的元素在右边。

temp = list[first];
int f = first, l = last;
while (f < l)
{
    while ((f <= l) && (list[l] < temp)) l--;
    if (f <= l)
    {
        list[f] = list[l];
        f++;
    }
    while ((f <= l) && (list[f] > temp)) f++;
    if (f <= l)
    {
        list[l] = list[f];
        l--;
    }
}

这段代码应该可以工作。(我在这台计算机上没有编译器)如果可以,请尝试递归调用函数本身。

另外还有一个忠告。正如许多人推荐的那样,尝试自己调试和解决问题。

希望能帮助到你

于 2012-04-26T11:49:39.000 回答