我正在使用动态内存分配创建一个程序,可以重新排列数组元素。但它给出了错误的结果。
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
int bubble_sort(int n,int *ar)
{
int i=0,j=0,temp;
for(i; i<n;i++)
{
for(j; j<n-i-1;j++)
{
if(*(ar + j)>*(ar + j + 1))
{
temp = *(ar + j);
*(ar + j) = *(ar + j + 1);
*(ar + j + 1) = temp;
}
}
}
}
main()
{
int n,i;
printf("Enter the size of the array : ");
scanf("%d",&n);
int *arr1 = (int *)calloc(n,sizeof(int));
printf("Enter the elements of first array : \n");
for(i=0;i<n;i++)
{
scanf("%d",(arr1+i));
printf("\n");
}
bubble_sort(n,arr1);
printf("After sorting, array is : \n");
for(i=0;i<n;i++)
{
printf("%d\t",*(arr1 + i));
}
}
它给出的输出只是一组随机的数字,我作为数组的元素输入。
例如,如果我输入数组的元素数为6,然后将元素输入为
7, 8, 9, 5, 6, 4
然后输出
7, 8, 5, 6, 4, 9
答案 0 :(得分:1)
你需要每次通过外循环从0开始j,改变
for(j; j<n-i-1;j++)
到
for(j=0; j<n-i-1; j++)
一般来说,最好在for循环中初始化计数器变量,以避免混淆其范围并避免这样的错误。所以即使
int i=0;
for(i; i<n;i++)
会更好地写成
int i;
for(i=0; i<n;i++)
甚至更好(对于现代C编译器)
for (int i = 0; i < n; i++)
答案 1 :(得分:0)
for(j; j<n-i-1;j++)
将for(j=0; j<n-i-1;j++)
需要此j=0
,因为您将从头开始比较。
同样for
i
的{{1}}循环将是for(i; i<n-1;i++)
。(这样做是因为i=n-1
永远不会使内循环运行 - 再迭代一次是多余的时间)(您已在块外部初始化i
0
,因此不需要i=0
并且可以跳过此选项。这是正确的方法,这可以为您提供所需的输出。
i
的初始化应该按照Tom Karzes的指示移动到for
循环,这是更清洁的设计和良好的实践。还要想一想,当你将局部变量声明到你使用它的范围之外时 - 控制和跟踪它会更加困难。即使您在for
块之外声明它也会在for循环中分配值0
。for(i =0;...)
或for(int i=0; ...)
是一个很好的方法。
有几件事*(arr+i)
与arr[i]
相同。不要让事情比应该更难阅读。应该检查calloc
的返回值,并且在完成后,分配的内存应该是免费的。