繁体   English   中英

字符串指针的C ++ Quicksort数组

[英]C++ Quicksort array of string pointers

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

这是实现:

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 ((*arr[i]).compare(pivot) < 0) {
        i++;
    }

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM