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