冒泡排序以无限循环结束

时间:2016-12-09 13:37:10

标签: c bubble-sort

我创建了一个冒泡排序程序。它以无限循环结束。 我在地方添加了注释,以便代码易于理解。 欢迎任何有关如何缩小代码的建议。

我正在调试程序并找到了这个 -

当stdin是" ccbbaa"并且在最终输入(aabbcc)和temp(aabbcc)相同的一些递归之后,然后在执行strcmp()的条件之后,' temp'被改为" baabcc"。

  1. 出现这种情况的原因有哪些? - 这就是无限循环的原因。

  2. 字符数组是否有' \ 0'最后(将输入复制到临时)?

  3. 我通过使用for循环而不是strcmp()解决了这个问题。调查为什么strcmp()目前无法正常工作。

    更新的代码可用 - http://ideone.com/4Bdblh(已解决)

    Buggy code

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<stdlib.h>
    #include<ctype.h>
    
    void sort(char* input)
    {
        const int length = strlen(input);
        int j = length -1;
        char temp[length];
        for(int i=0; i<length; i++)
        {
            temp[i]= *(input+i);
        }
    
        while(j)
        {
            if((int)*(input+1) < (int)*(input))
            {
                char temp1;
                temp1 = *(input);
                *input = *(input + 1);
                *(input + 1) = temp1;
            }
            input++;
            j--;
        }
            input = input - length +1;
            while(strcmp(temp,input))
            {
            sort(input);
            }
    }
    int main()
    {
        char* input = malloc(sizeof(char)*1000);
        scanf("%[^\n]%*c",input);
        sort(input);
        printf("%s",input);
        return 0;
    }
    

3 个答案:

答案 0 :(得分:1)

使用数组和循环答案 -

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
#define MAX 1000

void sort(char input[])
{
    const int length = strlen(input);
    int j = length -1;
    char temp[length];
    for(int i=0; i<length; i++)
    {
        temp[i]= input[i];
    }
    int l=0;
    while(j)
    {

        if(input[l+1] < input[l])
        {
            char temp1;
            temp1 = input[l];
            input[l] = input[l+1];
            input[l+1] = temp1;
        }
        l++;
        j--;
    }
        for(int k=0; k<length; k++)
        {
            if(temp[k]!=input[k])
            {
                sort(input);
            }
        }       
}
int main()
{
    char input[MAX];
    scanf("%[^\n]%*c",input);
    sort(input);
    printf("%s",input);
    return 0;
}

答案 1 :(得分:0)

在C中,字符串只是一个以0结尾的字符数组。

所有字符串函数都假设char数组以零结尾。

strcpy复制包含末尾0分隔符的字符串。因此,目标必须有足够的空间用于字符串加零。

strlen返回字符串的长度,因此目标必须至少为strlen(输入)+1 long。

如果你在一个循环中复制字符串,那么你一定不要忘记添加结束零。

我真正得到的是为什么要使它递归并进行字符串比较以检测完成。你可以实现两个从0到长度的嵌套循环--2。它保证它最终会被排序。

如果您想让它自适应,只需存储您交换的最后一个位置。你不需要进一步循环。

答案 2 :(得分:0)

  

当stdin为“ ccbbaa”并经过几次递归后,当最终输入(aabbcc)和temp(aabbcc)相同时,则在执行strcmp()条件后,将'temp'的值更改为“ baabcc”

     
      
  1. 为什么会发生这种情况? —这就是无限循环的原因。
  2.   

看起来'temp'的值已更改为“ baabcc” ,因为该函数返回到先前的递归级别,其中本地temp具有与以前相同的值。无限循环的主要原因是由于while(strcmp(temp,input))一次又一次地比较了未排序的旧temp

  
      
  1. 字符数组的末尾是否有“ \ 0”(将输入复制到temp时)?
  2.   

越野车代码中的temp数组还没有;你本可以写

    char temp[length+1];
    strcpy(temp, input);

或仅使用strncmp()而不是strcmp()

因此,要使程序正常运行,只需进行更改即可

        while(strcmp(temp,input))

        if (strncmp(temp, input, length))