【问题标题】:Reverse bubble sort (biggest to the left) doesn't seem to work [closed]反向冒泡排序(左侧最大)似乎不起作用[关闭]
【发布时间】:2019-03-29 11:19:13
【问题描述】:

我想使用“反向冒泡排序”对 12 个整数进行排序(我们称之为“溺水斧排序”)。我的功能对我来说看起来不错,但出了点问题。

错误:输入了我的 12 个随机数后,我没有打印出结果,而是我的编译器停止并且不再继续。

谁能帮忙?

代码:

#include<math.h>
#include<math.h>

void array_clean(int a[11]) //just an array cleaner
{
  for(int i=0; i<12; i++)
  {
     a[i] = a[i]&&0; // smth && 0 = 0 anyway
  }
}

void axe_sort(int a[11]) //drowning-axe sort function
{
    int place = 0;
    for(int i=0; i<12; i++)
    {
        for(int j=0; j<12; j++)
        {
            if(a[j]<a[j+1])
                place=a[j];
                a[j] = a[j+1];
                a[j+1] = place;
        }
    }
}

int main(void)
{
    int array[11]; //declaring an integer array;
    array_clean(& array[11]); // giving user-filed array to a cleaner function
    printf("Enter 12 random integers you'd like to sort: ");
    for(int m=0; m<12; m++)
    {
        scanf("%d", &array[m]); //letting user to fill an array
    }
    axe_sort(&array[11]); //sorting an array via our axe_sort function
    for(int m=0; m<12; m++)
    {
        printf("%d", array[m]); //printing the sorted array
    }

    return 0;
}

【问题讨论】:

  • 如果你的编译器停止并且没有继续运行,它会给你编译器错误,告诉你它为什么停止。为什么您的帖子中没有这些消息?
  • 是什么让你觉得你需要a[i] = a[i]&amp;&amp;0?为什么你不能只做a[i] = 0
  • @KenWhite 很可能是一个术语错误。如果编译器停止,那么就没有程序可以执行,从而无法输入数字。我怀疑他的意思是程序停止了,考虑到所有因素,这种结果的可能性要大得多。
  • @KenWhite 我使用 xcode。它显示了这一点:122334455667788990243546(lldb) 并停止工作

标签: c reverse bubble-sort


【解决方案1】:

首先,您应该包含stdio.h 头文件以便使用printf()scanf()

您正在处理 12 个整数。那你为什么要声明一个11个整数的数组???

int array[11]; //declaring an integer array;  <-------- change the size to 12 from 11

array_clean(); 的目的是用 0 来初始化每个数字。你可以简单地用 0 代替 a[i]&amp;&amp;0;

这里传递的是第 12 个元素的地址。

array_clean(&array[11]); //<---------------------

您应该传递base element(1st) 的地址。 你可以通过两种方式做到这一点。

 array_clean(&array[0]); 
 Or,
 array_clean(array);

当数组用作值时,其名称代表第一个元素的地址。

最后,请检查您的bubble 排序逻辑。

    for(int j=0; j<12; j++)
            {
                if(a[j]<a[j+1])
                    {place=a[j]; //<-----curly braces missing in the body of if 
                    a[j] = a[j+1];  //<----error
                    a[j+1] = place;
                    }

            }

对于 j=11,您的代码将尝试访问第 12 个索引,这将为您提供segmentation fault。将if 的正文用curly braces 括起来。

这是修改后的代码

#include<math.h>
#include<stdio.h> // <---------- include this header file 

void array_clean(int a[12]) //just an array cleaner
  {
       for(int i=0; i<12; i++)
    {
       a[i] = 0; // smth && 0 = 0 anyway
    }

  }

void axe_sort(int a[12]) //drowning-axe sort function
{
  int i,j;

    for(i=0; i<11; i++)
    {
        for(j=0; j<11-i; j++)  //<-------- see the logic carefully
        {
            if(a[j] < a[j+1])   //<-----put curly braces
                {int place=a[j];
                a[j] = a[j+1];
                a[j+1] = place;}
        }
    }

}

    int main(void)
     {
        int array[12]; //declaring an integer array;
        array_clean(&array[0]); // <---------------- pass the base address
        printf("Enter 12 random integers you'd like to sort: ");
        for(int m=0; m<12; m++)
        {
            scanf("%d", &array[m]); //letting user to fill an array
        }
         axe_sort(&array[0]); // <---------------- pass the base address
        for(int m=0; m<12; m++)
        {
            printf("%d ", array[m]); //printing the sorted array
        }

return 0;
}

【讨论】:

    【解决方案2】:

    我认为您忘记在代码中包含 stdio.h 库

    【讨论】:

    • 我建议在此答案中添加您为什么这么认为以及它将如何帮助提问者。这将得到一个更完整的答案。
    【解决方案3】:

    您的数组int array[11]; 没有按照您的想法进行。这声明了一个由 11 个整数组成的数组,索引从 0 到 10(含)。没有array[11],因此尝试访问它会导致未定义的行为。

    您的for 循环的格式正确,它将正确迭代数组的12 个成员,编号为0 到11(含)。但是,您需要将数组声明为 int array[12]; 以使其足够大以工作。

    另外,您使用&amp;array[11] 将数组传递给两个函数。你只需要说array,它就会正确地传入数组。您正在做的事情会导致这两个函数覆盖随机内存,这绝对无济于事。

    尝试修复这些问题,看看有什么变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      相关资源
      最近更新 更多