2016-04-26 140 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; 
}