2012-09-19 43 views
2

我有一個由兩個元素char *wordint number組成的結構。當我想用冒泡排序對它們進行排序,我必須寫交換部分對他們倆的:使用冒泡排序排序結構數組 - 如何加速結構成員交換

int i,j,tmp; 
    char * temp; 
    for(i=0; i<max;i++) 
    { 
     for(j=0;j<max-i;j++) 
     { 
      if(strcmp(array[j].word,array[j+1].word)>0) 
      { 
       temp=array[j].word; 
       array[j].word=array[j+1].word; 
       array[j+1].word=temp; 
       tmp=array[j].number; 
       array[j].number=array[j+1].number; 
       array[j+1].number=tmp; 

      } 
     } 
    } 

編輯我的struct聲明

typedef struct{ 
    char *word; 
    int number; 
} 
words; 
words *array=NULL; 

如果我數組中有n個元素?交換一切將會非常耗時。有什麼辦法可以省略這個嗎?

OF COURSE除了其他排序算法,我不想使用(如qsort)。

+2

你爲什麼要優化在bubblesort中的交換?你爲什麼不想使用像quicksort這樣的真正的排序算法? –

+1

@AdamRosenfield也許他正在嘗試學習bubblesort? – James

+0

你聲明struct嗎?也許你可以有一個指向struct的指針數組,而不是struct的數組。 – nhahtdh

回答

1
int i, j, tmp; 
words temp; 

for (i = 0; i < max; i++) 
{ 
    for (j = 0; j < max - i; j++) 
    { 
     if (strcmp(array[j].word, array[j + 1].word) > 0) 
     { 
      memcpy(&temp, array[j], sizeof(words)); 
      memcpy(array[j], array[j + 1], sizeof(words)); 
      memcpy(array[j + 1], &temp, sizeof(words)); 
     } 
    } 
} 
+0

我知道'memcpy',但不會拿出一個想法來使用它來排序巨大的結構與他們所有的元素。十分感謝! –

3

如果您關注的是在交換過程中的表現,你應該考慮和類型的指針數組的結構使用的是:

struct your_stuct *arr[MAX]; 

如果設置正確這個陣列,交換隻會更改內存地址,而不是結構的內容,它可以運行得更快:

在你的內部循環,你應該使用:

struct your_struct *temp; 
temp = arr[i]; 
arr[i] = arr[i+1]; 
arr[i+1] = temp; 

是你米這算什麼在你的問題中是否可以?

+0

是的,謝謝關於指針的建議。而不是速度,我正在尋找不寫每個結構成員的交流。每個成員3行,我想象有8個成員 - 這將是24行代碼,只是爲了更換。可怕的 –

1

而不是排序structs本身,創建一個指向該結構的指針數組,以及一個適當的比較函數,通過指針從結構中讀取適當的值,並對指針列表進行排序。當然,由於結構體系相當小,所有額外的間接函數都可能會掩蓋您從實際交換結構體中獲得的性能收益,但對於大型結構體來說,這種方法很有意義。