2015-12-31 91 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个字节。 –