鱼C论坛

 找回密码
 立即注册
查看: 1188|回复: 5

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

[复制链接]
发表于 2023-8-28 16:56:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


void main()
{
        test01();

        system("parse");
        return 0;

}
大佬们,首先这个程序无法运行说是出现了一些错误,然后,我还有一些疑问,就是关于冒泡排序法的,我感觉自己这段时间学习的一点也不扎实,而且还总是忘记,关于这里面的一些逻辑问题我还是很迷糊,唉,我是不是应该补充一点数学的知识,我感觉自己的逻辑不通
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-28 16:56:43 | 显示全部楼层
首先,让我们来解决你提供的代码中的问题。在你的代码中,有几个地方需要进行修改:

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

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

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

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[0]); i++) {
        for (int j = 0; j < sizeof(arr) / sizeof(arr[0]) - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }

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

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

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

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

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

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

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

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

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

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

如果你对冒泡排序还有其他疑问,或者有其他需要解答的问题,请随时追问!
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-28 16:57:31 | 显示全部楼层
首先,关于你的代码无法运行的问题,我注意到你在交换元素时出现了一个错误。在冒泡排序中,你需要将较大的元素向后移动,而不是将较小的元素向前移动。所以,在交换元素时,你需要将 arr[j] 赋值给 tamp ,然后将 tamp 赋值给 arr[j+1] ,而不是将 arr[j+1] 赋值给 arr[j+1] 。这是你修复代码的地方:
if (arr[j] > arr[j + 1])
{
    int tamp = arr[j];
    arr[j] = arr[j + 1]; // 将较大的元素向后移动
    arr[j + 1] = tamp;
}

另外,你在内部循环的条件中出现了一个错误。你需要将 sizeof(arr) / sizeof(arr[0]) - i - 1 作为循环的终止条件,而不是仅仅写 sizeof(arr) / sizeof(arr[0]) - i - 1 。这是你修复代码的地方:
for (int j = 0; j < sizeof(arr) / sizeof(arr[0]) - i - 1; j++) // 添加 "<" 符号
{
    // 冒泡排序的代码
}

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

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

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

关于你提到的数学知识,冒泡排序算法并不需要太多的数学知识。它更多地涉及到对数组和循环的理解。如果你对逻辑有困惑,建议你多练习编写简单的代码,加深对基本概念和语法的理解。同时,阅读相关的教材和学习资源也是提高编程能力的好方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-29 12:21:00 | 显示全部楼层
其实基础问题还是比较多的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-29 12:30:48 | 显示全部楼层
这种问题的话,建议先问ChatGPT(例如:c.binjie.fun),然后再来论坛问。
问题解决:
1.swap方法错了。应为
. . . 
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
. . . 
对应最内层括号里的内容。这个要注意,顺序不能搞反了。

2.冒泡排序我好像没见过像你这样排的,我一般是这两个循环嵌套。
        for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
        {
                for (int j = i+1;j< sizeof(arr) / sizeof(arr[0]); j++)
                {
                        if (arr[i] > arr[j])
                        {
                                int temp = arr[j];
                                arr[j] = arr[i];
                                arr[i] = temp;
                        }
                }
        }
3.system("pause")
4.
int main()
而不是
void main()
void main()在现在的编译器会报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 02:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表