冒泡排序不适用于C中的动态内存分配

时间:2018-02-10 07:20:20

标签: c

我正在使用动态内存分配创建一个程序,可以重新排列数组元素。但它给出了错误的结果。

这是我的代码:

#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

2 个答案:

答案 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循环中分配值0for(i =0;...)for(int i=0; ...)是一个很好的方法。

有几件事*(arr+i)arr[i]相同。不要让事情比应该更难阅读。应该检查calloc的返回值,并且在完成后,分配的内存应该是免费的。