首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多维阵列上的气泡排序

多维阵列上的气泡排序
EN

Stack Overflow用户
提问于 2015-12-31 15:37:53
回答 2查看 76关注 0票数 1

今天我试着对一个多维数组进行排序,但我不知道为什么它不能工作。

该算法对第一个字母进行交换,但不交换整个字符串。下面是一个工作的演示,它显示算法按字母顺序打印找到的每个字符串的首字母。

用于交换整个字符串的算法--不仅仅是第一个字母--不起作用:

代码语言:javascript
运行
复制
#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;
}

我得到的输出是:

代码语言:javascript
运行
复制
Adda  Adda  Adda  Donna  Donna  Donna  Donna

它应该是:

代码语言:javascript
运行
复制
Adda Donna Jenny Kimberly Michael Tanja Walter
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-31 15:40:53

tmp只是一个指针。因此,在赋值tmp = arr[k];和随后的strcpy()期间,由于arr[k]arr[k+1]覆盖而丢失了。但是您需要在交换期间复制字符串。所以使用一个缓冲区:

代码语言:javascript
运行
复制
char tmp[256];

代码语言:javascript
运行
复制
  strcpy(tmp , arr[k]);
  strcpy(arr[k], arr[k+1]);
  strcpy(arr[k+1], tmp);
票数 4
EN

Stack Overflow用户

发布于 2015-12-31 15:43:06

代码语言:javascript
运行
复制
 tmp = arr[k];

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

你可以这样做-

代码语言:javascript
运行
复制
char tmp[20];
strcpy(tmp,arr[k]);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34548524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档