多维数组上的冒泡排序

时间:2015-12-31 15:37:53

标签: c arrays

今天我尝试对多维阵列进行排序,但我无法弄清楚,为什么它无法正常工作。

算法执行第一个字母的交换,但不会交换整个字符串。这是一个有效的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 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

 tmp = arr[k];

由于tmp指向arr[k],在arr[k+1]中复制arr[k]并在后者中复制tmp后,您得到的值与{{1}相同本身已修改(arr[k] 指向此修改后的值)。

你可以这样做 -

tmp