2010-03-21 57 views
1

你能告诉我我的方法有什么问题吗?我最终把每件事都放在同一件事上,而实际上并没有进行排序。字符指针的C++排序数组

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; 





      } 

     } 

    } 
+0

为什么不使用'qsort'或'std :: sort'? – vava

+1

当您尝试使用自己的标准算法而不是使用提供的标准算法时,会发生这种情况。引入愚蠢的小错误太容易了。 –

回答

10

此:

char* title_temp = title_arr[i]; 

title_arr[j] = title_temp; 

等同于:

title_arr[j] = title_arr[i]; 

你永不掉它们,你只需要复制一个到另一个。你应该加上这一行:

title_arr[i] = title_arr[j]; 

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

我想这也是一个算法课的时间。您的算法被称为"bubble sort"算法。它以简单性着称,但在现实环境中,它被称为效率低下(技术术语是“tex 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刺,但它会大致相同的(也许更容易)工作。**

*请注意,任何人谁喜欢自由地改变这些维基百科链接堆栈溢出链接。最好链接到SO,我只是链接到维基百科,因为我知道如何更快地找到我需要的信息。
**请注意,任何喜欢的人都可以自由添加std::sort示例。我只是不太熟悉C++。

+0

谢谢......是的,这工作得很好。 – user69514

+0

@ user69514 - 更重要的是,你明白吗? –

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

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