2015-12-31 111 views
0

今天我試着對多維數組進行排序,但我無法弄清楚,爲什麼它不起作用。多維數組上的氣泡排序

該算法執行第一個字母的交換,但不交換整個字符串。這是一個工作DEMO,它顯示該算法按字母順序打印每個找到的字符串的縮寫。

用來交換整個字符串不只是第一個字母相同的算法,不工作:

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

int main(void){ 
    char arr[][10] = {"Michael" , "Tanja" ,"Adda", "Jenny", "Kimberly", "Walter" , "Donna"}; 
    size_t length = sizeof arr/sizeof *(arr + 0); 
    unsigned int i,j, k=0; 
    char *tmp; 


    for (i = 0 ; i < length-1; i++){ 
     for (k = 0 ; k < length-i-1; k++){ 
      if (arr[k][0] > arr[k+1][0]){ 
       tmp = arr[k]; 
       strcpy(arr[k], arr[k+1]); 
       strcpy(arr[k+1], tmp); 
      } 
     } 
    } 

    printf("Sorted Array:\n"); 
    for (j = 0 ; j < length ; j++){ 
     printf("%s ", arr[j]); 
    } 
    printf("\n\n"); 

    return 0; 
} 

輸出,我得到的是:

Adda Adda Adda Donna Donna Donna Donna 

,它應該是:

Adda Donna Jenny Kimberly Michael Tanja Walter 
+2

的問題是,'TMP = ARR [K];'存儲的'ARR [K]''中的tmp'地址。記住:內存地址是不變的,不會改變。此外,您可以使用'sizeof * arr'而不是'sizeof *(arr + 0)' –

+0

@CoolGuy我知道,我想我只是忽略了那部分。謝謝你,祝你新年快樂。 – Michi

回答

4

tmp只是一個指針。因此,在作業tmp = arr[k];和後續strcpy()期間,由於arr[k]arr[k+1]覆蓋而丟失。但你需要拷貝交換過程中的字符串。因此,使用一個緩衝:

char tmp[256]; 

strcpy(tmp , arr[k]); 
    strcpy(arr[k], arr[k+1]); 
    strcpy(arr[k+1], tmp); 
+0

我建議使用'char tmp [10];'而不是'char tmp [256];' –

+1

@CoolGuy'256'已被選爲多個骰子滾動後的最佳選擇:D無論如何都是任意大小,10考慮到我們正在處理*姓名*,可能會過於接近安慰。 「正確尺寸」只能由OP根據OP處理的輸入數據決定。 –

+0

對不起,對答遲了。謝謝你,新年快樂。 – Michi

3
tmp = arr[k]; 

由於tmp指向arr[k],在後者arr[k]和複製tmp複製arr[k+1]後,你會得到相同的值,因爲arr[k]本身修改(tmp指向此修改值)。

可以做到這一點,而不是 -

char tmp[20]; 
strcpy(tmp,arr[k]); 
+0

我建議使用'char tmp [10];'而不是'char tmp [20];' –

+0

@CoolGuy爲了防止複製到其他數組時溢出? – ameyCU

+0

10因爲'arr'在每行中有10個槽:'char arr [] [10]'。 'char tmp [20]'浪費10個字節。 –