1

你能告诉我我的方法有什么问题吗?我最终把同样的东西放在每一个地方,它实际上并没有排序。

void sortArrays(){

    int i, j;



    for(i=0; i<counter; i++){



        for( j=0; j<i; j++){

            if( strcmp(title_arr[i], title_arr[j]) < 0){

                char* title_temp = title_arr[i];

                title_arr[j] = title_temp;





            }

        }

    }
4

3 回答 3

10

这:

char* title_temp = title_arr[i];

title_arr[j] = title_temp;

相当于:

title_arr[j] = title_arr[i];

你永远不会交换它们,你只是将一个复制到另一个。你应该添加这一行:

title_arr[i] = title_arr[j];

介于两者之间。这样,您将用 覆盖[i][j]_temp仍保留 的旧值[i],因此您可以将该值复制到[j]中,从而交换它们。

我想这也是学习算法的时间。您的算法被称为“冒泡排序”算法。它以简单而闻名,但在现实环境中,它以效率低下而闻名(技术术语是“teh sux”,真正的技术术语是O(n^2)(“N 平方”)性能)。一些更常见(和更有效)的算法包括快速排序合并排序排序等。有关测量算法可扩展性的更多信息,请参阅有关Big Oh 表示法的文章。*

但是,正如 vava 在评论中指出的那样,除非您的任务是编写自己的排序函数,qsort否则(在 C 中)或std::sort(在 C++ 中)您将获得更好的性能。

int mystrsort(const void *a, const void *b)
{
    return strcmp(*(const char **)a, *(const char **)b);
}

// later:
qsort(title_arr, sizeof title_arr / sizeof(char *), sizeof(char *), mystrsort);

我不会刺伤std::sort,但它的工作原理大致相同(也许更容易)。**

*请注意,任何喜欢的人都可以自由地将这些 Wikipedia 链接更改为 Stack Overflow 链接。最好链接到 SO,我只是链接到 Wikipedia,因为我知道如何更快地找到我需要的信息。
**请注意,任何喜欢的人都可以自由添加std::sort示例。我只是对 C++ 不够熟悉。

于 2010-03-21T04:20:40.013 回答
1

你没有正确交换,这就是它不起作用的原因。

#include <iostream>
#include <algorithm>

int const counter = 4;
char * title_arr[counter] = {
    "d", "c", "b", "a"
};

void sortArrays(){
    for(int i = 0; i < counter; i++){
        for(int j = 0; j < i; j++){
            if(strcmp(title_arr[i], title_arr[j]) < 0){
                char* title_temp = title_arr[i];
                title_arr[i] = title_arr[j];
                title_arr[j] = title_temp;
                //you wouldn't have made that stupid mistake this way.
                //std::swap(title_arr[i], title_arr[j]);
            }
        }
    }
}

int compare(void const * a, void const * b) {
    return strcmp(static_cast<char const *>(a), static_cast<char const *>(b));
}

struct StringLess : public std::binary_function<char const *, char const *, bool> {
    bool operator() (char const * a, char const * b) const {
        return strcmp(a, b) < 0;
    }
};

int main(int argc, char * argv[])
{
    sortArrays();
    //those ones better
//  qsort(title_arr, counter, sizeof(char *), compare);
//  std::sort(title_arr, title_arr + counter, StringLess());
    for (int i = 0; i < counter; i++) {
        std::cout << title_arr[i] << ", ";
    }
    return 0;
}
于 2010-03-21T04:40:21.560 回答
1

不好的编码风格:
1. 不要使用全局变量。最好将数组和长度作为参数传递给排序函数。为什么?您的功能不可重用。如果您需要对另一个数组进行排序怎么办?是的,您将需要编写另一个排序函数...
2. 更高级的提示:使用高阶函数的仿真。如果您不仅需要对字符进行排序怎么办?整数、浮点数、字符串或您自己的类型。在这种情况下,您还可以将compare()函数传递给可以比较数组对象的排序函数。

于 2010-03-21T05:30:01.590 回答