<使用生成式AI对四种冒泡排序实现形式分析解释的探讨整理>

news2024/11/21 2:22:40

<使用生成式AI对四种冒泡排序实现形式分析解释的探讨整理>

文章目录

  • <使用生成式AI对四种冒泡排序实现形式分析解释的探讨整理>
    • 1.冒泡排序实现形式总结
        • 1.1关于冒泡排序实现形式1的来源:
        • 1.2对四种排序实现形式使用AI进行无引导分析:
        • 1.3AI(通义千问)给出的传统冒泡排序和优化后的冒泡排序

前言:在笔者学习的不同时期阶段,曾遇到多种冒泡排序算法的实现形式,这些形式纷繁多样,在一定时期阶段带给笔者些许疑惑,然而通过深入学习理解之后,发现其本质却都满足冒泡排序算法的思想和基本定义。对其归纳总结所得四种冒泡排序算法实现形式使用生成式AI进行分析解释探讨整理。

1.冒泡排序实现形式总结

//冒泡排序实现1——不常用(这个版本两层for循环分别是i++、j++)
void bubbleSort(int A[], int n) {
    int i, j, temp; // 声明三个整型变量i、j和temp用于循环控制和交换元素
    for (i = 0; i < n - 1; i++) { // 外层循环,从数组的第一个元素开始遍历到倒数第二个元素
        for (j = i+1; j < n; j++) { // 内层循环,从当前外层循环位置的下一个元素开始遍历到最后一个元素
            if (A[i] > A[j]) { // 如果当前元素大于下一个元素
                temp = A[i]; // 将当前元素存储到临时变量temp中
                A[i] = A[j]; // 将下一个元素赋值给当前元素
                A[j] = temp; // 将临时变量temp的值(原当前元素的值)赋值给下一个元素
            }
        }
    }
}

//冒泡排序实现2——王道考研指导书及课件(这个版本两层for循环分别是i++、j--)
//交换
void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}
//冒泡排序
void bubbleSort(int A[], int n) {
    for (int i = 0; i < n - 1; i++) {
        bool flag = false; // 表示本趟冒泡是否发生交换的标志
        for (int j = n - 1; j > i; j--) { // 一趟冒泡过程
            if (A[j - 1] > A[j]) { // 若为逆序
                swap(A[j - 1], A[j]); // 交换
                flag = true;
            }
        }
        if (flag == false)
            return; // 本趟遍历后没有发生交换,说明表已经有序
    }
}

//冒泡排序实现3——不常用(这个版本两层for循环分别是i--、j++)
void bubbleSort(int A[], int n) {
    for (int i = n - 1; i > 1; i--) {
        for (int j = 1; j < i; j++) {
            if (A[j] > A[j + 1]) {
                int temp = A[j];
                A[j] = A[j + 1];
                A[j + 1] = temp;
            }
        }
    }
}

//冒泡排序实现4——典型(或标准)冒泡排序,未优化(这个版本两层for循环分别是i++、j++)
void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        // 一趟冒泡排序的过程
        for (int j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
}
//注:上述除了实现2之外,均为未优化的冒泡排序
//实现2 在冒泡排序的基础上增加了一个优化,即通过标志位 flag 来判断在某一趟排序过程中是否发生了元素交换。如果在某趟排序过程中没有发生任何交换,说明数组已经有序,可以提前结束排序过程。这种优化在最好情况下(输入数组已经有序)可以将时间复杂度降低到 O(n),但在最坏情况下(逆序数组)时间复杂度仍然是 O(n^2)。即总结:A.包含了一个早期退出机制(flag变量),可以在数组已经有序的情况下提前结束排序。B:减少了不必要的比较和交换操作。
//相比之下,实现1、3和4都是一般的冒泡排序或其变种实现形式,它们的时间复杂度在所有情况下都是 O(n^2)。因此,从理论上讲,实现2在最好情况下比实现1、3和4更优。
//然而,在实际应用中,这种优化带来的性能提升可能并不明显,因为大多数情况下输入数据不会是完全有序的。此外,这种优化也增加了代码的复杂性。因此,是否使用实现2 取决于具体的应用场景和需求。在某些情况下,简单的标准冒泡排序可能已经足够满足需求。
//空间复杂度:所有的实现都具有O(1)的空间复杂度,因为它们只使用了常数级的额外空间。
1.1关于冒泡排序实现形式1的来源:

在这里插入图片描述
通义千问回答:
在这里插入图片描述

该解释比较有说服力。

讯飞星火回答:

在这里插入图片描述

该解释有些不全面。

ChatGPT-4o回答:

在这里插入图片描述

该解释比较有说服力(与通义千问解释近似)。

1.2对四种排序实现形式使用AI进行无引导分析:
//排序实现1
void Sort(int A[], int n) {
int i, j, temp; // 声明三个整型变量i、j和temp用于循环控制和交换元素
for (i = 0; i < n - 1; i++) { // 外层循环,从数组的第一个元素开始遍历到倒数第二个元素
  for (j = i+1; j < n; j++) { // 内层循环,从当前外层循环位置的下一个元素开始遍历到最后一个元素
      if (A[i] > A[j]) { // 如果当前元素大于下一个元素
          temp = A[i]; // 将当前元素存储到临时变量temp中
          A[i] = A[j]; // 将下一个元素赋值给当前元素
          A[j] = temp; // 将临时变量temp的值(原当前元素的值)赋值给下一个元素
      }
  }
}
}

//排序实现2
//交换
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
//排序
void Sort(int A[], int n) {
for (int i = 0; i < n - 1; i++) {
  bool flag = false; 
  for (int j = n - 1; j > i; j--) { 
      if (A[j - 1] > A[j]) { // 若为逆序
          swap(A[j - 1], A[j]); // 交换
          flag = true;
      }
  }
  if (flag == false)
      return; // 本趟遍历后没有发生交换,说明表已经有序
}
}
//排序实现3
void Sort(int A[], int n) {
for (int i = n - 1; i > 1; i--) {
  for (int j = 1; j < i; j++) {
      if (A[j] > A[j + 1]) {
          int temp = A[j];
          A[j] = A[j + 1];
          A[j + 1] = temp;
      }
  }
}
}

//排序实现4
void Sort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
  for (int j = 0; j < n - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
          int tmp = arr[j];
          arr[j] = arr[j + 1];
          arr[j + 1] = tmp;
      }
  }
}
}
请详细分析上述四个算法实现,分别逐行解释?分别属于哪种排序?并分析时间复杂度和空间复杂度?以及各自的优缺点,总结和对比四种算法实现。

ChatGPT-4o:

在这里插入图片描述

该分析较为有说服力!但对算法类型的总结有误!

讯飞星火:
在这里插入图片描述

该解释尚可!主要不够详细!

通义千问:
在这里插入图片描述

该解释尚可!但其认为实现1为选择排序,然后询问其“是否满足选择排序的定义”之后,又给出前后矛盾的解释!

对于上述四种实现形式三种AI给出的解释分析总结:

(1)通义千问和ChatGPT-4o首先认为实现1为选择排序的变种,在质问“符合哪种排序定义”之后,两者均改称其为冒泡排序的变种,给出的解释前后矛盾,多次从不同角度询问,其回答左右摇摆!

(2)讯飞星火坚称四种实现均属于冒泡排序,只是实现的形式不同。(注:这些实现形式是笔者在不同的学习阶段遇到,在此汇总探讨整理,笔者较认可讯飞星火的解释)

一些关于冒泡排序不同实现形式在不同AI的分析回答详情:(链接如下)

通义千问-关于冒泡排序几种不同实现分析2024/10/01

讯飞星火-关于冒泡排序几种不同实现分析2024/10/01

ChatGPT-4o(科学上网打开)-关于冒泡排序几种不同实现分析2024/10/01

注:上述问答是笔者在进行多次实验之后汇总整理(即经过多次实验),可以感受到笔者被其分析解释的前后矛盾,左右摇摆带来的无奈与折腾。

1.3AI(通义千问)给出的传统冒泡排序和优化后的冒泡排序
//传统冒泡排序
//传统冒泡排序的基本思想是通过多次遍历数组,每次将相邻的两个元素进行比较并交换,使得每一轮遍历后最大的元素“冒泡”到数组的末尾。
#include <iostream>
using namespace std;

// 传统冒泡排序
void BubbleSortTraditional(int A[], int n) {
    for (int i = 0; i < n - 1; i++) { // 外层循环,从第一个元素到倒数第二个元素
        for (int j = 0; j < n - 1 - i; j++) { // 内层循环,从第一个元素到未排序部分的倒数第二个元素
            if (A[j] > A[j + 1]) { // 如果当前元素大于下一个元素
                // 交换
                int temp = A[j];
                A[j] = A[j + 1];
                A[j + 1] = temp;
            }
        }
    }
}

// 主函数,用于测试排序功能
int main() {
    int A[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(A) / sizeof(A[0]);

    cout << "Original array: ";
    for (int i = 0; i < n; ++i) {
        cout << A[i] << " ";
    }
    cout << endl;

    BubbleSortTraditional(A, n);

    cout << "Sorted array: ";
    for (int i = 0; i < n; ++i) {
        cout << A[i] << " ";
    }
    cout << endl;

    return 0;
}
//优化后的冒泡排序
//优化后的冒泡排序增加了早期退出机制。如果在某一轮遍历中没有发生任何交换,说明数组已经有序,可以提前结束排序。
#include <iostream>
using namespace std;

// 交换函数
void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

// 优化后的冒泡排序
void BubbleSortOptimized(int A[], int n) {
    for (int i = 0; i < n - 1; i++) { // 外层循环,从第一个元素到倒数第二个元素
        bool swapped = false; // 标志变量,用于检测本轮是否有交换
        for (int j = 0; j < n - 1 - i; j++) { // 内层循环,从第一个元素到未排序部分的倒数第二个元素
            if (A[j] > A[j + 1]) { // 如果当前元素大于下一个元素
                swap(A[j], A[j + 1]); // 交换
                swapped = true; // 设置标志变量
            }
        }
        if (!swapped) { // 如果本轮没有发生交换,说明数组已经有序
            break; // 提前退出
        }
    }
}

// 主函数,用于测试排序功能
int main() {
    int A[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(A) / sizeof(A[0]);

    cout << "Original array: ";
    for (int i = 0; i < n; ++i) {
        cout << A[i] << " ";
    }
    cout << endl;

    BubbleSortOptimized(A, n);

    cout << "Sorted array: ";
    for (int i = 0; i < n; ++i) {
        cout << A[i] << " ";
    }
    cout << endl;

    return 0;
}

观察发现主要算法逻辑是不是同实现4一样? 因为即使是其它AI的解释答案,也是建立在网络搜索基础之上…

在这里插入图片描述

在这里插入图片描述
总结:应该按照各种排序的定义区分相应排序类型。俗话说:“尽信书,不如无书”,迁移到此处就是“尽信AI,不如多理解”。在当今,其实应该辩证的使用AI工具,不能全然依托AI,而是将其作为辅助,同时自身也要多去学习,提升自身的判断和理解。

后记:由于时间仓促,上述探讨在整理过程中亦有思维逻辑有误之处,然而在计算机这类学科中,“定义”不是绝对的衡量标尺,笔者更是在计算机研究生全国统考408的《数据结构》、《操作系统》、《计算机网络》、《计算机组成原理》的学习中就有深刻体会。因此,世间纷繁、事事接踵绵延,应抓住主要矛盾,有时切不能再耗费大量精力在一些琐事之上了…
此刻已是10月1日凌晨3点33分。今天正值祖国成立75周年,笔者在此向祖国致以最诚挚最衷心的祝福与敬意!向无数前辈致以崇高的敬意!中华人民共和国万岁!世界人民大团结万岁!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2182719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字节终面问Transformer,就很离谱...

Transformer 是目前 NLP 甚至是整个深度学习领域不能不提到的框架&#xff0c;同时大部分 LLM 也是使用其进行训练生成模型&#xff0c;所以 Transformer 几乎是目前每一个机器人开发者或者人工智能开发者不能越过的一个框架。 接下来本文将从顶层往下去一步步掀开 Transforme…

只写CURD后台管理的Java后端要如何提升自己

你是否工作3~5年后&#xff0c;发现日常只做了CURD的简单代码。 你是否每次面试就会头疼&#xff0c;自己写的代码&#xff0c;除了日常CURD简历上毫无亮点可写 抱怨过苦恼过也后悔过&#xff0c;但是站在现在的时间点回想以前&#xff0c;发现有很多事情我们是可以做的更好的。…

宁夏众智科技OA办公系统存在SQL注入漏洞

漏洞描述 宁夏众智科技OA办公系统存在SQL注入漏洞 漏洞复现 POC POST /Account/Login?ACTIndex&CLRHome HTTP/1.1 Host: Content-Length: 45 Cache-Control: max-age0 Origin: http://39.105.48.206 Content-Type: application/x-www-form-urlencoded Upgrade-Insecur…

【C语言指南】数据类型详解(上)——内置类型

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C语言指南》 期待您的关注 目录 引言 1. 整型&#xff08;Integer Types&#xff09; 2. 浮点型&#xff08;Floating-Point …

C++ 游戏开发

C游戏开发 C 是一种高效、灵活且功能强大的编程语言&#xff0c;因其性能和控制能力而在游戏开发中被广泛应用。许多著名的游戏引擎&#xff0c;如 Unreal Engine、CryEngine 和 Godot 等&#xff0c;都依赖于 C 进行核心开发。本文将详细介绍 C 在游戏开发中的应用&#xff0…

【机器学习】ID3、C4.5、CART 算法

目录 常见的决策树算法 1. ID3 2. C4.5 3. CART 决策树的优缺点 优点&#xff1a; 缺点&#xff1a; 决策树的优化 常见的决策树算法 1. ID3 ID3&#xff08;Iterative Dichotomiser 3&#xff09;算法使用信息增益作为特征选择的标准。它是一种贪心算法&#xff0c;信…

Ubuntu开机进入紧急模式处理

文章目录 Ubuntu开机进入紧急模式处理一、问题描述二、解决办法参考 Ubuntu开机进入紧急模式处理 一、问题描述 Ubuntu开机不能够正常启动&#xff0c;自动进入紧急模式&#xff08;You are in emergency mode&#xff09;。具体如下所示&#xff1a; 二、解决办法 按CtrlD进…

基于SpringBoot+Vue的智能宾馆预定系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

基于人工智能的实时健身训练分析系统:深蹲姿态识别与动作评估

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

前端css样式设置元素的绝对定位和相对定位,要注意宽度和高度的设置

vue3子div position absolute,父div positon relative 。如果不设置子div的 width 和height,那么子div中如果数据变长,子div相对父div位置会变化。子div数据超过&#xff0c;显示... 如何实现 <template><div class"parent"><div class"child&q…

[含文档+PPT+源码等]精品大数据项目-基于Django实现的高校图书馆智能推送系统的设计与实现

大数据项目——基于Django实现的高校图书馆智能推送系统的设计与实现背景&#xff0c;可以从以下几个方面进行详细阐述&#xff1a; 一、信息技术的发展背景 随着信息技术的飞速发展和互联网的广泛普及&#xff0c;大数据已经成为现代社会的重要资源。在大数据背景下&#xf…

深入计算机语言之C++:C到C++的过度

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;从C语言到C语言的渐深学习 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 一、什么是C C&#xff08;c plus plus&#xff…

stm32单片机学习 - MDK仿真调试

1 进行环境配置 点击 Options for Target&#xff0c;也就是我们俗称的魔法棒。 将"C/C"中的Optimization选项选为Level 0(-O0) 作用:优化等级调为0级,便于调试时分析代码 勾选"Debug"中的Load Application at Starup 和 Run to main() 选项 作用:Load…

DBeaver详细安装与使用教程-免费的数据库管理工具

一、简介 二、安装教程 三、使用教程 1. 连接MySQL数据库 2. 查看表数据 3. 查看表属性 3. SQL编辑器和控制台 4.在DBeaver中设置定时备份数据库 一、简介 dbeaver是一款的数据库连接工具&#xff0c;免费&#xff0c;跨平台。 官网&#xff1a;DBeaver Community | …

前端——切换轮播图

学完前端js小知识后&#xff0c;动手操作的一个简单图片轮播图。 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"keywords" content"关键词信息"><meta name"des…

数据中心交换机与普通交换机之间的区别到底在哪里?

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 上午好&#xff0c;我的网工朋友。 数据中心交换被设计用来满足数据中心特有的高性能、高可靠性和可扩展性需求。 与此同时&#xff0c;普通交换机…

ACL(Access Control List)访问控制列表

目录 ACL 访问控制列表 ACL分类 ACL的组成 ACL匹配机制 ACL调用方式 实验配置 不允许PC1访问PC4 只允许PC1访问PC4 高级ACL 基本概念 实验配置 限制ping 实验配置 限制DNS 基于时间的ACL 实验配置 ACL 访问控制列表 根据一系列不同的规则&#xff0c;设备根据这…

使用Python实现Auto.js的自动输入图形验证码

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【unity进阶知识6】Resources的使用,如何封装一个Resources资源管理器

文章目录 一、Unity资源加载的几种方式1、Inspector窗口拖拽2、Resources3、AssetBundle4、Addressables&#xff08;可寻址资源系统&#xff09;5、AssetDatabase 二、准备三、同步加载Resources资源1、Resources.Load同步加载单个资源1.1、基本加载1.2、加载指定类型的资源1.…

详解JavaScript中把函数作为值

8.4 作为值的函数 JS中函数不仅是一种语法&#xff0c;也是值&#xff0c;也就是说&#xff0c;可以将函数赋值给变量&#xff0c;存储在对象的属性或者数组的元素中&#xff0c;作为参数传入另外一个函数等。 来看一个函数&#xff1a;function square(x){return x*x;} 定义…