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

<使用生成式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.xdnf.cn/news/1552090.html

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

相关文章

【floor报错注入】

一、sql语句基础 floor 向下取整 count 取数据的数量 group by 分组查询 Rand 随机数 limit 二、floor报错注入 主键重复报错 我们先了解group by产生的虚拟表的原理&#xff0c;了解到虚拟表的主键是不可以重复的 我们再可以通过Rand(0)函数规定固定种子后乘2&…

Win10之Ubuntu22.04(主机)与Virtual-BOX(宿主win10)网络互通调试(七十九)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

An End-to-End Local Attention Based Model for Table Recognition(ICDAR 2023)

An End-to-End Local Attention Based Model for Table Recognition(ICDAR 2023) 一.前述 作者认为基于Transformer的表格识别模型很难处理大表格的识别&#xff0c;原因是受限于它的全局注意力global attention机制。 基于以上&#xff0c;作者提出了一种局部注意力local a…

.NET Core 高性能并发编程

一、高性能大并发架构设计 .NET Core 是一个高性能、可扩展的开发框架&#xff0c;可以用于构建各种类型的应用程序&#xff0c;包括高性能大并发应用程序。为了设计和开发高性能大并发 .NET Core 应用程序&#xff0c;需要考虑以下几个方面&#xff1a; 1. 异步编程 异步编程…

在线css像素Px到百分比(%)换算器

具体请前往&#xff1a;在线Px转百分比(%)工具--将绝对像素(px)长度单位转换为相对父级元素内尺寸的相对长度单位百分比(%)

PCL 点云模型滤波(圆形)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 生成点云数据 2.1.2 模型滤波函数 2.1.3 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xf…

树和二叉树知识点大全及相关题目练习【数据结构】

树和二叉树 要注意树和二叉树是两个完全不同的结构、概念&#xff0c;它们之间不存在包含之类的关系 树的定义 树&#xff08;Tree&#xff09;是n&#xff08;n≥0&#xff09;个结点的有限集&#xff0c;它或为空树&#xff08;n 0&#xff09;&#xff1b;或为非空树&a…

lambda表达式底层实现:反编译LambdaMetafactory + 转储dump + 运行过程 + 反汇编 + 动态指令invokedynamic

一、结论先行 lambda 底层实现机制 1.lambda 表达式的本质&#xff1a;函数式接口的匿名子类的匿名对象 2.lambda表达式是语法糖 语法糖&#xff1a;编码时是lambda简洁的表达式&#xff0c;在字节码期&#xff0c;语法糖会被转换为实际复杂的实现方式&#xff0c;含义不变&am…

基于springboot的数据库原理教学案例案例库管理系统

目录 毕设制作流程功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行代码执行流程核心代码部分展示可行性分析软件测试详细视频演示源码获取 毕设制作流程 &#xff08;1&#xff09;与指导老师确定系统主要功能&#xff1b; &#xff08;2&am…

PMP--三模--解题--71-80

文章目录 7.成本管理--S曲线--S曲线对累计值进行监督和报告--S曲线可以同时报告成本与进度情况。适用于预测和敏捷项目。14.敏捷--信息发射源--是一种可见的实物展示其向组织内其他成员提供信息在不干扰团队的情况下即时实现知识共享。71、 [单选] 项目经理正在为刚刚进入第三次…

windows配置C++编译环境和VScode C++配置(保姆级教程)

1.安装MinGW-w64 MinGW-w64是一个开源的编译器套件,适用于Windows平台,支持32位和64位应用程序的开发。它包含了GCC编译器、GDB调试器以及其他必要的工具,是C++开发者在Windows环境下进行开发的重要工具。 我找到了一个下载比较快的链接:https://gitcode.com/open-source-…

FastAPI 第九课 -- 表单数据

目录 一. 前言 二. 声明表单数据模型 三. 在路由中接收表单数据 四. 表单数据的验证和文档生成 五. 处理文件上传 一. 前言 在 FastAPI 中&#xff0c;接收表单数据是一种常见的操作&#xff0c;通常用于处理用户通过 HTML 表单提交的数据。 FastAPI 提供了 Form 类型&a…

C++发邮件:如何轻松实现邮件自动化发送?

C发邮件的详细步骤与教程指南&#xff1f;如何在C中发邮件&#xff1f; 无论是定期发送报告、通知客户还是管理内部沟通&#xff0c;自动化邮件系统都能显著提升工作效率。AokSend将详细介绍如何使用C发邮件&#xff0c;实现邮件自动化发送&#xff0c;帮助您轻松管理邮件通信…

车视界系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;汽车品牌管理&#xff0c;汽车颜色管理&#xff0c;用户管理&#xff0c;汽车信息管理&#xff0c;汽车订单管理系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;汽车信息&#xff0c;我…

4.1、FineReport单元格扩展和父子格

单元格扩展 1、配置数据集 2、纵向扩展 方法一&#xff1a; 方法二&#xff1a; 结果 多个字段纵向 2、横向扩展 方法一&#xff1a; 方法二&#xff1a; 结果 父子格 没什么特殊要求&#xff0c;就保持默认 1、右边的值默认以左边为左父格 2、下边的值默认以上边…

【Windows】如何取消显示Windows聚焦在桌面上生成的“了解此图片”图标

如下图所示&#xff0c;在更换Windows聚焦显示的时候&#xff0c;会在桌面多出一个“了解此图片”的图标&#xff0c;看着很烦&#xff0c;但又因为Windows聚焦自带的壁纸比其他主题的壁纸好看很多。 下面是消除办法&#xff1a; 打开注册表&#xff08;按WindowsR&#xff0…

【COSMO-SkyMed系列的4颗卫星主要用途】

COSMO-SkyMed系列的4颗卫星主要用于提供一个多用途的对地观测平台&#xff0c;服务于民间、公共机构、军事和商业领域。以下是这4颗卫星的主要用途&#xff1a; 民防与环境风险管理&#xff1a; 卫星的高分辨率雷达图像可用于监测自然灾害&#xff0c;如地震、洪水、滑坡等&am…

51单片机学习第六课---B站UP主江协科技

DS18B20 1、基本知识讲解 2、DS18B20读取温度值 main.c #include<regx52.h> #include"delay.h" #include"LCD1602.h" #include"key.h" #include"DS18B20.h"float T; void main () {LCD_Init();LCD_ShowString(1,1,"temp…

汽车革命下半场AI先锋:广汽为新“智”汽车装配大模型“底盘”

汽车革命的上半场是电动化&#xff0c;下半场是智能化&#xff0c;这是全球汽车产业普遍认同的观点。当前&#xff0c;我国汽车产业已经在电动化上半场取得了显著成效&#xff0c;在下半场智能化的全球战场能否胜出&#xff0c;关键看车企的创新意愿和研发实力。 在2024年9月1…

【Orange Pi 5嵌入式应用编程】-用户空间GPIO控制

用户空间GPIO控制 文章目录 用户空间GPIO控制1、嵌入式Linux的GPIO子系统介绍1.1 sysfs文件访问GPIO1.2 通过字符设备访问GPIO1.3 库与工具2、RK3588的GPIO介绍3、用户空间操作GPIO编程3.1 硬件准备3.2 通过libgpio操作GPIO3.2.1 GPIO输出3.2.3 GPIO输入3.2.3 边沿事件检测(中断…