2016-04-26 97 views
-11

我正在试着做一个函数来获取'argv',并用冒泡排序对它进行排序。由于某种原因,冒泡排序不起作用,我找不到问题。用字符串进行泡泡排序

void order(int howmany, char** strings) 
{ 
    int i = 0; 
    char* temp = (char*)malloc(sizeof(char)*20); 

    for (i = 1; i < howmany-1; i++) 
    { 
     if (strcmp(strings[i], strings[i + 1]) > 0) 
     { 
      strcpy(temp, strings[i]); 
      strcpy(strings[i], strings[i+1]); 
      strcpy(strings[i + 1], temp); 
     } 
     else if (strcmp(strings[i], strings[i + 1]) < 0) 
     { 
      continue; 
     } 
     else 
     { 
      continue; 
     } 

    } 

} 
+2

你应该做一些调试。 –

+1

问题是使用冒泡排序的逻辑,http://stackoverflow.com/questions/16636890/sorting-strings-with-bubble-sort-algorithm –

+2

在就地修改命令行参数是一个坏主意。首先制作它们的副本,然后对其进行分类。 – Lundin

回答

3

要对所有字符串进行排序,您需要多个循环。只需一个循环,您就可以将第一个最小/最大的一个移动到合适的位置,然后算法停止。另外,为什么你从i = 1开始而不是0?就像你没有比较第一个字符串和其他字符串一样。 好运

1

这使用来自维基百科文章,因为我们正在排序非空char *的阵列转换为C.稍微优化冒泡排序(在子序列跳过不必要的比较通行证)(通过strcmp对结果排序被引用的字符串),它交换指针,而不是字符串内容。

#include <stdio.h> 
#include <string.h> 

void order(int howmany, char** strings) 
{ 
    int i; 
    char* temp; 
    int lastswap; 

    do 
    { 
     lastswap = 0; 
     for (i = 0; i < howmany - 1; i++) 
     { 
      if (strcmp(strings[i], strings[i + 1]) > 0) 
      { 
       temp = strings[i]; 
       strings[i] = strings[i + 1]; 
       strings[i + 1] = temp; 
       lastswap = i; 
      } 
     } 
     howmany = lastswap; 
    } 
    while (lastswap != 0); 
} 

int main(int argc, char** argv) 
{ 
    int i; 
    int howmany; 
    char** strings; 

    if (argc > 0) { 
     howmany = argc - 1; 
     strings = argv + 1; 
     order(howmany, strings); 
     for (i = 0; i < howmany; i++) 
      printf("%s\n", strings[i]); 
    } 
    return 0; 
}