冒泡排序需要很长时间才能分段

时间:2019-01-04 16:31:40

标签: c bubble-sort

  

给定一个整数n,编写一个C程序以计算一个整数mn中的数字但升序后在同一位置的位数。的数字。例如,如果n的值是351462987,则m的值将是123456789,数字4和8将位于同一位置。

这是我的代码:

#include<stdio.h>

void bubble(int a[],int length)
{
    for (int i=0;i<length;i++)
    {
        for (int j=0;j<length;j++)
        {
            if (a[j]>a[j+1])
            {
                int t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
}
int check(int a[],int b[],int length)
{
    int count=0;
    for (int i=0;i<length;i++)
    {
        if (a[i]==b[i])
        {
            count=i;
            break;
        }
    }
    return count;
}
int length(int n)
{
    int l;
    while (n!=0)
    {
        n=n/10;
        l++;
    }
    return l;
}
void main()
{
    int n,arrn[100],temp[100];
    scanf("%d",&n);
    int l=length(n);
    for (int i=0;i<l;i++)
    {
        arrn[l-i-1]=n%10;
        temp[l-i-1]=arrn[l-i-1];
        n=n/10;
    }
    bubble(temp,l);
    int c=check(arrn,temp,l);
    printf("%d",c);
}

我能够编译代码,但是当我执行它时,花很长时间才显示出分段错误。

3 个答案:

答案 0 :(得分:1)

简单的答案,使用调试器

您的代码有问题:

  • length函数中,l未初始化,因此可以具有任意初始值。就您而言,您可能想从0开始。

    int l = 0;
    
  • 您的check函数可能没有执行您想要的操作。如count所写,不是计数,而是数字匹配的位置的索引。由于该块中有一个break语句,因此循环将在第一个匹配项后退出,因此返回值将是第一个匹配项的位置,如果找不到匹配项,则返回值为0。

  • bubble等于i时,您的length - 1函数会超出一项,因为您在无限循环的内部循环中访问项a[j + 1]。在这种情况下,从1而不是0开始比较索引i - 1的项目与索引i的项目比较简单。

一些注意事项:

  • 建议在运算符前后以及用逗号分隔多个声明后添加空格,以提高可读性。这是一些具有提高的可读性的行的示例。

    int n, arrn[100], temp[100];
    int count = 0;
    for (int i = 0; i < length; i++)…
    if (a[i] == b[i])…
    arrn[l - i - 1] =n % 10;
    temp[l - i - 1] = arrn[l - i - 1];
    int check(int a[], int b[], int length)
    
  • 您应该编写一个功能并确保其正常工作,而不是一次编写多个功能。顺便说一下,将数字分解为数字的循环也可以是一个函数。

    • 尝试少量(例如12或21)的功能
    • 为您的变量使用更好的名称。 arrntemp不太清楚。 originalsorted可能更好。

答案 1 :(得分:0)

您的长度函数有一个非常明显的错误。 l以什么值开头?您无需对其进行初始化,因此它可以以任何值开头并导致未定义的行为。您应该将其设置为0。

int length(int n)
{
    int l = 0;
    while (n!=0)
    {
        n=n/10;
        l++;
    }
    return l;
}

答案 2 :(得分:0)

就我个人而言,我不会将其排序或读取为int -以便能够处理数字字符串中的前导零。例如:

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

#define MAXNUMLEN 200
int main(void)
{
   int i, j, l, x=0;
   char numin[MAXNUMLEN], numout[MAXNUMLEN];
   int digits[10]={0};

   printf("enter a string of digits: " );
   fgets(numin, sizeof(numin), stdin); 
   printf("\nsaw   : %s", numin );

   // walk string once, counting num of each digit present
   l=strlen(numin);
   for(i=0; i<l; i++) {
      if( isdigit(numin[i]) ) {
         int d = numin[i] - '0'; // char digit to int digit
         digits[d]++;
      }
   }

   // for each digit present, write the number of instances of the digit to numout
   for( i=0; i<10; i++ ) {
      for(j=0; j<digits[i]; j++)
         numout[x++] = '0'+i; // int digit back to char digit
   }
   numout[x]='\0'; // terminate string
   printf("sorted: %s\n", numout );
}

样品运行:

watson:digsort john$ ./ds
enter a string of digits: 002342123492738234610

saw   : 002342123492738234610
sorted: 000112222233334446789
watson:digsort john$