C ++排序char指针数组

时间:2010-03-21 04:18:18

标签: c++ string sorting pointers bubble-sort

你能告诉我我的方法有什么问题吗?我最终把每件事都放在同一件事上,而实际上并没有排序。

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;





            }

        }

    }

3 个答案:

答案 0 :(得分: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],从而交换它们。

我想这也是算法课程的时候了。您的算法称为"bubble sort"算法。它以其简单而着称,但在现实的环境中,它的效率低下(技术术语是“teh sux”,真正的技术术语是O(n^2)(“N平方”)性能。一些更常见(和更有效)的算法包括Quicksortmerge sortHeapsort等等。有关测量算法可伸缩性的更多信息,请参阅Big Oh notation。*

上的文章

但是,正如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会更好,我只是链接到维基百科,因为我知道如何更快地找到我需要的信息 **请注意,任何喜欢的人都可以免费添加std::sort示例。我对C ++并不熟悉。

答案 1 :(得分:2)

你没有正确交换,这就是为什么它不起作用。

#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;
}

答案 2 :(得分:1)

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