学c的萌新 发表于 2023-8-28 16:56:00

我有关于冒泡排序法还是有很多疑问的,恳求大佬们帮我解决

#include<stdio.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
        //论数和次数,还有元素个数之间的关系就是,元素数字为sizeof(arr)/sizeof(arr);,论数是元素个数-1;次数是元素个数-对比论数-1
void test01()
{
        int arr[] = { 4,2,1,3,5,7,8,6,0 };
        for (int i = 0; i < sizeof(arr) / sizeof(arr); i++)
        {
                for (int j = 0; sizeof(arr) / sizeof(arr) - i - 1; j++)
                {
                        if (arr > arr)
                        {
                                int tamp = arr;
                                arr = arr;
                                arr = tamp;
                        }
                }
        }
        for (int i = 0; i < sizeof(arr) / sizeof(arr); i++)
        {
                printf("%d", arr);
        }
        printf("\n");
}


void main()
{
        test01();

        system("parse");
        return 0;

}
大佬们,首先这个程序无法运行说是出现了一些错误,然后,我还有一些疑问,就是关于冒泡排序法的,我感觉自己这段时间学习的一点也不扎实,而且还总是忘记,关于这里面的一些逻辑问题我还是很迷糊,唉,我是不是应该补充一点数学的知识,我感觉自己的逻辑不通

陶远航 发表于 2023-8-28 16:56:43

首先,让我们来解决你提供的代码中的问题。在你的代码中,有几个地方需要进行修改:

1. 在内部循环的判断条件中,你需要比较j和sizeof(arr) / sizeof(arr) - i - 1的大小关系,并将结果作为条件。你可以修改为 j < sizeof(arr) / sizeof(arr) - i - 1。

2. 在交换元素的代码中,你需要将arr = arr;修改为arr = arr;,因为你希望交换的是相邻的两个元素。

此外,你还需要注意一些细节问题:

3. 将void main()改为int main(),并将return 0;改为return 0;。main()函数应该返回一个int类型的值。

4. 将system("parse");改为system("pause");,以便在程序执行完后暂停输出结果。

修改后的代码如下所示:

#include<stdio.h>
#include<stdlib.h>

#define _CRT_SECURE_NO_WARNINGS

void test01() {
    int arr[] = { 4,2,1,3,5,7,8,6,0 };

    for (int i = 0; i < sizeof(arr) / sizeof(arr); i++) {
      for (int j = 0; j < sizeof(arr) / sizeof(arr) - i - 1; j++) {
            if (arr > arr) {
                int temp = arr;
                arr = arr;
                arr = temp;
            }
      }
    }

    for (int i = 0; i < sizeof(arr) / sizeof(arr); i++) {
      printf("%d ", arr[ i]);
    }
    printf("\n");
}

int main() {
    test01();
    system("pause");
    return 0;
}


至于你对冒泡排序算法的疑问,我会尽量解答:

冒泡排序是一种简单的排序算法,它通过多次比较和交换相邻元素的方式,将较大的元素逐步向右侧移动,从而达到排序的目的。

冒泡排序的基本思路如下:

1. 从第一个元素开始,依次比较相邻的两个元素。如果前一个元素大于后一个元素,就交换它们的位置,使较大的元素向右移动。

2. 经过一轮比较之后,最后一个元素一定是当前未排序部分的最大值。

3. 对除最后一个元素外的剩余元素,重复步骤1和2,直到所有元素都被排序。

根据冒泡排序的性质,每经过一轮比较,未排序部分的最大值就会浮到最右侧,因此内层循环的次数逐渐减少。外层循环控制进行多少轮比较,最多需要进行n-1轮比较(n为元素个数)。

关于你提到的数学知识,对于理解冒泡排序并不是必需的。冒泡排序主要涉及到算法和编程的概念,而不是复杂的数学计算。重点是理解算法的思想和实现方式,并通过实际的代码练习来加深理解和记忆。

如果你对冒泡排序还有其他疑问,或者有其他需要解答的问题,请随时追问!
如果问题已经解决,请设置最佳答案

isdkz 发表于 2023-8-28 16:57:31

首先,关于你的代码无法运行的问题,我注意到你在交换元素时出现了一个错误。在冒泡排序中,你需要将较大的元素向后移动,而不是将较小的元素向前移动。所以,在交换元素时,你需要将 arr 赋值给 tamp ,然后将 tamp 赋值给 arr ,而不是将 arr 赋值给 arr 。这是你修复代码的地方:

if (arr > arr)
{
    int tamp = arr;
    arr = arr; // 将较大的元素向后移动
    arr = tamp;
}


另外,你在内部循环的条件中出现了一个错误。你需要将 sizeof(arr) / sizeof(arr) - i - 1 作为循环的终止条件,而不是仅仅写 sizeof(arr) / sizeof(arr) - i - 1 。这是你修复代码的地方:

for (int j = 0; j < sizeof(arr) / sizeof(arr) - i - 1; j++) // 添加 "<" 符号
{
    // 冒泡排序的代码
}


关于你对冒泡排序算法的疑问,冒泡排序是一种简单但低效的排序算法。它的基本思想是通过相邻元素的比较和交换来将最大(或最小)的元素逐渐“浮”到数组的末尾。这个过程类似于冒泡泡上升到表面的过程,因此得名冒泡排序。

冒泡排序的核心是双重循环。外层循环控制论数(轮数),内层循环控制次数(每轮需要比较的次数)。每一轮内层循环都会将当前未排序部分中的最大元素“冒泡”到最后。所以,内层循环的终止条件是元素个数减去当前论数减一。

冒泡排序的时间复杂度是O(n^2),其中n是数组的大小。由于它需要进行多次比较和交换,所以在大规模数据排序时效率较低。如果你想提高排序算法的效率,可以考虑使用其他更高效的排序算法,如快速排序或归并排序。

关于你提到的数学知识,冒泡排序算法并不需要太多的数学知识。它更多地涉及到对数组和循环的理解。如果你对逻辑有困惑,建议你多练习编写简单的代码,加深对基本概念和语法的理解。同时,阅读相关的教材和学习资源也是提高编程能力的好方法。

额外减小 发表于 2023-8-29 12:21:00

其实基础问题还是比较多的。

额外减小 发表于 2023-8-29 12:30:48

这种问题的话,建议先问ChatGPT(例如:c.binjie.fun),然后再来论坛问。
问题解决:
1.swap方法错了。应为. . .
int temp=arr;
arr=arr;
arr=temp;
. . .
对应最内层括号里的内容。这个要注意,顺序不能搞反了。

2.冒泡排序我好像没见过像你这样排的,我一般是这两个循环嵌套。
      for (int i = 0; i < sizeof(arr) / sizeof(arr); i++)
      {
                for (int j = i+1;j< sizeof(arr) / sizeof(arr); j++)
                {
                        if (arr > arr)
                        {
                              int temp = arr;
                              arr = arr;
                              arr = temp;
                        }
                }
      }
3.system("pause")
4.int main()
而不是
void main()
void main()在现在的编译器会报错。

额外减小 发表于 2023-8-29 12:37:18

对于你的代码修改了一下
修改的地方写在注释里面
#include<stdio.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
      //论数和次数,还有元素个数之间的关系就是,元素数字为sizeof(arr)/sizeof(arr);,论数是元素个数-1;次数是元素个数-对比论数-1
void test01()
{
      int arr[] = { 4,2,1,3,5,7,8,6,0 };
      for (int i = 0; i < sizeof(arr) / sizeof(arr); i++)
      {
                for (int j = 0; sizeof(arr) / sizeof(arr) - j - 1; j++) //origin:    ...for (int j = 0; sizeof(arr) / sizeof(arr) - i - 1; j++)
                {
                        if (arr > arr)
                        {
                              int tamp = arr;//
                              arr = arr;//origin:   arr=arr
                              arr = tamp;//
                        }
                }
      }
      for (int i = 0; i < sizeof(arr) / sizeof(arr); i++)
      {
                printf("%d", arr);
      }
      printf("\n");
}


int main()//origin:    void main()
{
      test01();

      system("pause");//origin:    "parse"
      return 0;

}
页: [1]
查看完整版本: 我有关于冒泡排序法还是有很多疑问的,恳求大佬们帮我解决