你能告诉我我的方法有什么问题吗?我最终把每件事都放在同一件事上,而实际上并没有排序。
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 :(得分: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平方”)性能。一些更常见(和更有效)的算法包括Quicksort,merge sort和Heapsort等等。有关测量算法可伸缩性的更多信息,请参阅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函数,该函数可以比较数组中的对象。