【问题标题】:C++ Quicksort array of string pointers字符串指针的 C++ 快速排序数组
【发布时间】:2013-11-12 00:44:55
【问题描述】:

我不确定出了什么问题,但这排序不正确。

这是实现:

int quickSort(std::string **arr, int left, int right)
{
    static int swaps;
    int i = left, j = right;
    std::string *tmp;
    std::string pivot = *arr[(left + right) / 2]; //middle element
    //partition
    while( i <= j ) {
        while ((*arr[i]).compare(pivot) < 0) {
            i++;
        }
        while ((*arr[j]).compare(pivot) < 0) {
            j--;
        }
        if ( i <= j ) {
            swaps++;
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    }
    //recursion
    if ( left < j ) {
        quickSort(arr, left, j);
    }
    if ( i < right ) {
        quickSort(arr, i, right);
    }
    return swaps;
}

arr 是一个字符串指针数组。每个索引指向一个字符串,在这种情况下,字符串都是名称。该方法肯定是在进行交换,我只是无法理解它到底在做什么。

例如,给定这些初始值:

Pointer    Value
0055B5D8 - JAMES
0055B3F8 - JOHN
0055C808 - ROBERT
0055C8A8 - MICHAEL
0055CB88 - WILLIAM
0055CC28 - DAVID
0055CCC8 - RICHARD
0055CD68 - CHARLES
0055CE08 - JOSEPH
0055CEA8 - THOMAS

我的quickSort 方法始终将它们按此顺序移动:

Pointer    Value
0055C8A8 - MICHAEL
0055B5D8 - JAMES
0055C808 - ROBERT
0055B3F8 - JOHN
0055CB88 - WILLIAM
0055CEA8 - THOMAS
0055CE08 - JOSEPH
0055CD68 - CHARLES
0055CCC8 - RICHARD
0055CC28 - DAVID

“未排序”列表具有按升序排列的指针,因为我将所有这些指针一个接一个地分配以构建初始数组。但“排序”列表似乎根本没有排序。

为清楚起见,我们的目标是按字母顺序排列姓名列表。

【问题讨论】:

  • 第二个while循环不应该是while ((*arr[j]).compare(pivot) &gt; 0)吗?您希望保留大于右侧枢轴的项目。
  • 如果你没有理由不使用向量,请去掉std::string **arr,至少改成std::vector&lt;std::string*&gt;&amp; strings

标签: c++ arrays string sorting pointers


【解决方案1】:

您对枢轴的两侧使用相同的比较。这意味着您允许较小的值保留在右侧。需要修改如下:

    while ((*arr[i]).compare(pivot) < 0) {
        i++;
    }

    while ((*arr[j]).compare(pivot) > 0) {    // <----
        j--;
    }

这是典型的复制粘贴错误。复制一段代码而不是从头开始编写时要小心。你的大脑很容易被欺骗,认为你改变了所有重要的部分。

【讨论】:

  • 呜……哈哈,谢谢。不敢相信我已经看了多久了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 2019-11-05
  • 1970-01-01
相关资源
最近更新 更多