2012-05-11 100 views
2

我想按照字典的名字對字符串進行排序。如何按照字典順序對結構中的字符串進行排序?

,所以我有結構

typedef struct buff{ 
    char *name; 
} structure; 

的數組,我複製與其相關的擴展名的文件的名稱。因此,該結構的內容看起來像s[0].name = "picture1.jpg"s[1].name = "DCP003.JPG"以及類似的東西。

我正在嘗試對此進行排序,而且我無法實現該目標..到目前爲止我所擁有的就是這個。

void sort(structure *s, int counter){ 

    for (int i = 0; i < counter - 1; i++){ 
     for (int j = 0; j < counter - 1 - i; j++){ 

       if (strcmp(s[j].name, s[j+1].name) > 0){ 

        structure tmp; 

        tmp = s[j]; 
        s[j] = s[j+1]; 
        s[j+1] = tmp; 

      } 
     } 
    } 

    for (int i = 0; i < counter; i++){ 
     printf("%d - %s\n", i+1, s[i].name); 
    } 
} 

它不工作,因爲我想..試了幾個版本仍然沒有好..我在哪裏犯錯誤?任何意見是極大的讚賞..

+0

'S [0]。名稱= 「picture1.jpg」;'是** **不復制。 – Mahesh

+0

使用基數排序:http://stackoverflow.com/questions/1271367/radix-sort-implemented-in-c –

+0

@Mahesh我知道如何將一個字符串的內容複製到另一個..實際上我使用sprintf對於這一個,這只是爲了說明可能的內容。 – Markus

回答

2

嘗試是這樣的:

typedef struct buff{ 
    char *name; 
} structure; 

structure s[5]; 

void sort(){ 
    int sz = sizeof s/sizeof s[0]; 
    printf("sz=%d\n",sz); 
    int done = 0; 

    for (int i = 0; i < sz; i++){ 
      for (int j = i+1; j < sz; j++){ 

        if (strcmp(s[i].name, s[j].name) > 0){ 

         structure tmp; 

         tmp = s[i]; 
         s[i] = s[j]; 
         s[j] = tmp; 
       } 
      } 
    } 
    for (int i = 0; i < sz; i++){ 
     printf("%d - %s\n", i+1, s[i].name); 
    } 
} 

int main() { 
    s[0].name = "dog"; 
    s[1].name = "ant"; 
    s[2].name = "cat"; 
    s[3].name = "man"; 
    s[4].name = "bear"; 
    sort(); 
    return 0; 
} 

輸出:

---------- Capture Output ---------- 
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe 
sz=5 
1 - ant 
2 - bear 
3 - cat 
4 - dog 
5 - man 

> Terminated with exit code 0. 
+0

,而我正在測試你的解決方案我發現,略有修改我的工作以及..所以,謝謝:) – Markus

3

在結構按字典順序使用快速排序字符串進行排序的最佳方式(STDLIB.H )(O(n日誌(N)))。

這是示例代碼::

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


struct names 
{ 
    char strvalues[20]; 
} buff[100]; 


int main() 
{ 
    int i; 
    strcpy(buff[0].strvalues,"some"); 
    strcpy(buff[1].strvalues,"example"); 
    strcpy(buff[2].strvalues,"strings"); 
    strcpy(buff[3].strvalues,"here"); 

    qsort (buff, 4, 20, (int(*)(const void*,const void*)) strcmp); 


    for(i=0;i<4;++i) 
    { 
     printf("%s\n",buff[i].strvalues);  
    } 

    return 0; 
} 
+0

我真的從來沒有知道如何正確使用它,無論如何我們應該自己寫這個算法,不過謝謝:) – Markus

+0

@ Markus ::我寫了上面的代碼,因爲它很快(Onlog(n))運行時間複雜度。但是你的代碼如下選擇排序算法O(n^2),這是很慢的。所以排序字符串的最快和最簡單的方法是qsort。嘗試通過stl http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/的教程,它會幫助你理解得很好:) –

+0

爲了我作業的目的,我只需要將它們整理出來不管速度如何,但感謝您擴展我的知識:) – Markus

相關問題