反向气泡排序(左侧最大)似乎不起作用

时间:2018-10-24 23:20:05

标签: c reverse bubble-sort

我想使用“反向冒泡排序”(无论如何,我们称其为“溺水斧头排序”)对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;
}

3 个答案:

答案 0 :(得分:1)

您的数组int array[11];并没有达到您的预期。这声明了一个11个整数的数组,索引从0到10(含0和10)。没有array[11],因此尝试访问它会导致未定义的行为。

您已经有了for循环的正确形式,它将正确地迭代数组的12个成员,编号为0到11(包括0和11)。但是,您需要将数组声明为int array[12];,以使其足够大才能正常工作。

此外,您正在使用&array[11]将数组传递给两个函数。您只需要说array,它就会正确传递到数组中。您正在执行的操作将导致这两个函数在随机内存上进行写操作,这绝对无济于事。

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

答案 1 :(得分: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]&&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 :(得分:-2)

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