【数据结构】冒泡排序,快速排序的学习知识总结

目录

1、冒泡排序

1.1 算法思想

1.2 代码实现 

方式一:顺序表 

方式二:链表

2、快速排序

2.1 算法思想

2.2 代码实现 

2.3 例题分析


1、冒泡排序

1.1 算法思想

         冒泡排序是一种简单的排序算法,它的基本思想是从数组的第一个元素开始依次比较相邻的两个元素,根据大小交换它们的位置,直到所有元素都排好序为止。

具体步骤如下:

        1. 从数组的第一个元素开始,依次比较相邻的两个元素。

        2. 如果前面的元素大于后面的元素,则交换它们的位置。

        3. 接着比较下一对相邻元素,重复上述步骤,直到遍历到数组的最后一个元素。

        4. 一次遍历过后,最后一个元素一定是当前数组中的最大元素,因此下一次遍历可以排除它。

        5. 重复上述步骤,直到所有元素都排好序为止。

冒泡排序的时间复杂度为O(n^2),不适合处理大规模的数据。但是它实现简单,适用于对小规模数据排序,并且由于其稳定性和可读性,仍然被广泛应用。

1.2 代码实现 

方式一:顺序表 

以下是C语言实现冒泡排序的代码:

#include <stdio.h>void bubbleSort(int arr[], int n);
void printArray(int arr[], int n);int main()
{int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组:\n");printArray(arr, n);bubbleSort(arr, n);printf("排序后的数组:\n");printArray(arr, n);return 0;
}void bubbleSort(int arr[], int n)
{int i, j, temp;for (i = 0; i < n - 1; i++)    // 外层循环控制轮数{for (j = 0; j < n - i - 1; j++)    // 内层循环控制比较和交换{if (arr[j] > arr[j + 1]){temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}void printArray(int arr[], int n)
{int i;for (i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");
}

输出结果:

原始数组:
64 34 25 12 22 11 90 
排序后的数组:
11 12 22 25 34 64 90

方式二:链表

以下是基于链表的冒泡排序的C语言实现代码:

#include <stdio.h>
#include <stdlib.h>struct node {int data;struct node* next;
};void swap(struct node* a, struct node* b) {int temp = a->data;a->data = b->data;b->data = temp;
}void bubbleSort(struct node* head) {int swapped, i;struct node* ptr1;struct node* lptr = NULL;if (head == NULL) {return;}do {swapped = 0;ptr1 = head;while (ptr1->next != lptr) {if (ptr1->data > ptr1->next->data) {swap(ptr1, ptr1->next);swapped = 1;}ptr1 = ptr1->next;}lptr = ptr1;} while (swapped);
}void printList(struct node* head) {struct node* temp = head;while (temp != NULL) {printf("%d ", temp->data);temp = temp->next;}
}void push(struct node** head_ref, int new_data) {struct node* new_node = (struct node*)malloc(sizeof(struct node));new_node->data = new_data;new_node->next = (*head_ref);(*head_ref) = new_node;
}int main() {struct node* head = NULL;push(&head, 5);push(&head, 20);push(&head, 4);push(&head, 3);push(&head, 30);printf("Original Linked List:\n");printList(head);bubbleSort(head);printf("\nSorted Linked List:\n");printList(head);return 0;
}

        该程序首先定义了一个结构体node,其中包含一个整型数据data和一个指向下一个结构体node的指针next。接着定义了三个函数:

  • swap函数用于交换两个结构体的数据成员data
  • bubbleSort函数实现了基于链表的冒泡排序。
  • printList函数用于遍历链表并打印所有节点的数据成员data

        最后,main函数中创建了一个空的链表,并用push函数向其中添加了五个节点。然后,原始链表被打印出来,接着使用bubbleSort函数对链表进行排序。最后,排好序的链表也被打印出来。

2、快速排序

2.1 算法思想

        快速排序(Quick Sort)是一种常用的排序算法,其基本思想是选取一个基准元素,将所有小于基准元素的数放到其左边,所有大于基准元素的数放到其右边,然后再对两边分别进行递归排序。快速排序是一种比较快的排序算法,平均时间复杂度为O(nlogn)。

具体算法步骤如下:

  1. 选取一个基准元素(通常是第一个元素或者随机选取),将数组分成左右两个部分;

  2. 将小于等于基准元素的数放到左边,大于基准元素的数放到右边,分别形成两个子数组;

  3. 对左右两个子数组进行递归排序,直到每个子数组只有一个元素或为空为止;

  4. 合并两个子数组,完成排序。

        快速排序的关键在于如何进行划分,一般采用双指针法,即左指针从左往右扫描数组,右指针从右往左扫描数组,当左指针找到一个大于基准元素的数,右指针找到一个小于基准元素的数时,交换两个数的位置,直到左指针和右指针相遇。最后将基准元素与左右子数组的中间位置交换,完成一次排序。

2.2 代码实现 

时间复杂度为O(nlogn)

下面是C语言实现快速排序的代码:

void quick_sort(int arr[], int left, int right) {if (left >= right)return;int i = left, j = right, pivot = arr[left];while (i < j) {while (i < j && arr[j] >= pivot)j--;arr[i] = arr[j];while (i < j && arr[i] <= pivot)i++;arr[j] = arr[i];}arr[i] = pivot;quick_sort(arr, left, i - 1);quick_sort(arr, i + 1, right);
}

        上述代码中,arr表示待排序数组,left表示待排序区间左边界,right表示待排序区间右边界。首先判断左右边界是否相等或左边界大于右边界,如果是,则直接返回。然后取arr[left]作为枢轴元素,从右向左找到第一个小于枢轴元素的元素,从左向右找到第一个大于枢轴元素的元素,并交换两个元素。重复上述操作直到i=j,将枢轴元素放到i位置上,此时数组被分成了两个部分,左边部分小于枢轴元素,右边部分大于枢轴元素。然后递归调用快速排序函数对左右两个部分进行排序。

2.3 例题分析

以下是一个快速排序的例题:

假设我们要对以下数组进行快速排序:[7, 2, 8, 1, 4, 3, 6, 5]

  • 首先选择一个基准值,可以选择数组中的任意一个数,这里我们选择第一个数7作为基准值。

  • 接着从数组的左边开始,找到第一个大于等于基准值的数,这里是8;然后从数组的右边开始,找到第一个小于等于基准值的数,这里是5,将它们交换位置。

现在数组变成了:[5, 2, 8, 1, 4, 3, 6, 7]

  • 继续从左到右找到一个大于等于基准值的数,这里是8,然后从右到左找到一个小于等于基准值的数,这里是3,将它们交换位置。

现在数组变成了:[5, 2, 3, 1, 4, 8, 6, 7]

  • 继续从左到右找到一个大于等于基准值的数,这里是4,然后从右到左找到一个小于等于基准值的数,这里是1,将它们交换位置。

现在数组变成了:[5, 2, 3, 1, 4, 8, 6, 7]

  • 继续从左到右找到一个大于等于基准值的数,这里是6,然后从右到左找到一个小于等于基准值的数,这里是1,将它们交换位置。

现在数组变成了:[5, 2, 3, 1, 4, 1, 6, 7, 8]

  • 重复上述步骤,直到将整个数组排好序。

最后的排序结果是:[1, 2, 3, 4, 5, 6, 7, 8]

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ahk系列——ahk_v2实现win10任意界面搜狗翻译

1、准备环境 win10或者以上系统安装ahkv2_64环境&#xff0c;安装包安装好后会有32和64位的unicode版本准备一个编译器&#xff0c;我用idea&#xff0c;不会ahk编程的我会把编译好的exe连接放到最后需要 联网 才能翻译 2、 使用方法 选中需要翻译的文字&#xff0c;然后ctr…

【OSCAR开源产业大会分论坛】开源大模型走向何方?

再过俩月&#xff0c;ChatGPT 即将迎来推出一周年纪念日。作为开历史先河的 AI 大模型&#xff0c;ChatGPT 像一针猛戳进千行百业中枢神经的兴奋剂&#xff0c;在全球掀起空前绝后的 AI 军备竞赛热潮。 近一年来&#xff0c;我们看到 GPT-3.5 完成向多模态的 GPT-4 进化&#x…

[Realtek sdk-3.4.14b]RTL8197FH-VG 2.4G to WAN吞吐量低于60%的问题分析及解决方案

问题描述 RTL8197FH-VG 2.4G wifi to WAN吞吐量低于65%的标准,正常2T2R的wifi 300Mbps x 65% = 195Mbps,但是实际只能跑到160Mbps,这个时候CPU的idl已经为0,sirq占用率达到98%左右 网络拓扑 一台PC通过2.4G WiFi连接到RTL8197FH-VG,另外一台PC直接通过WAN口连接到RTL8197…

【Verilog教程】6.7 Verilog流水线

关键词&#xff1a;流水线&#xff0c;乘法器 硬件描述语言的一个突出优点就是指令执行的并行性。多条语句能够在相同时钟周期内并行处理多个信号数据。 但是当数据串行输入时&#xff0c;指令执行的并行性并不能体现出其优势。而且很多时候有些计算并不能在一个或两个时钟周期…

美篇作文网教学资源源码-自带作文数据

非常漂亮的UI设计和页面排版&#xff01; 自适应手机pc端 页面内容均支持自定义 可以用来做网站矩阵&#xff0c;或者增强你其他网站板块&#xff0c;或者单独运营都可以。 可以通过广告方式变现&#xff0c;或者引流等等 友好的seo&#xff0c;更容易被浏览器收录 关注青狐…

LINUX|ubuntu常用指令

文章目录 查看IP显示当前路径下所有文件安装编译工具GCC、调试工具GDB、连接工具SSHmkdir 创建目录export命令显示当前系统定义的所有环境变量echo $PATH命令输出当前的PATH环境变量的值当前命令行添加环境变量&#xff0c;关闭失效&#xff0c;防止多版本库冲突时使用sudo su打…

新移科技发布基于联发科MT8390(Genio 700)平台的物联网 AI 核心板

新移科技研发的XY8390物联网 AI 核心板是一款高度集成、功能强大的平台&#xff0c;该核心板专为各种人工智能 (AI) 和物联网 (IoT) 用例而设计。 处理器采用了 Arm DynamIQ™ 技术&#xff0c;结合了高性能 Cortex-A78 内核和高能效 Cortex-A55 内核&#xff0c;并配备了 Arm …

二维平面扭曲的python实现及思路

二维平面扭曲的python实现及思路 缘起原理实现代码 缘起 工作需要&#xff0c;需要一个尝试改变设备布点的方法&#xff0c;在csdn闲逛时&#xff0c;偶然间发现这样的一篇文章 二维扭曲&#xff0c;参考这位博主的文章&#xff0c;我对其内容进行复现和进一步挖掘。若有侵权或…

四川玖璨电子商务有限公司抖音电商界的领跑者

在当今的电商市场中&#xff0c;四川玖璨电子商务有限公司以其卓越的表现和领先的地位&#xff0c;被广大消费者和业内人士所认可。作为抖音电商领跑者&#xff0c;该公司以其精湛的产品和服务&#xff0c;创新的营销策略&#xff0c;及客户至上的理念&#xff0c;成为这个充满…

爬取北京新发地当天货物信息并展示十五天价格变化(三)---获取物品十五天内的价格

。。。。。。。。。。。。。。。。。。。。。。 1.网页请求一下内容2.通过爬虫进行请求3.获取商品十五天详细数据并绘制折线图4.项目详细代码 1.网页请求一下内容 通过抓包我们发现一共七个参数 limit: 20 # 一页多少数据 current: …

JPA的注解@Field指定为Keyword失败,导致查询不到数据

一、背景 使用 jpa 对es操作&#xff0c;查询条件不生效&#xff0c;需求是批量查询课程编号。说白了&#xff0c;就是一个In集合的查询。在es里&#xff0c;如果是精准匹配是termQuery&#xff0c;比如&#xff1a; queryBuilder.filter(QueryBuilders.termQuery(“schoolId…

C++ placement new使用

placement new重载来原来的operator new&#xff0c;且placement new不能被即需重载 placement new是在原有的一块地址上继续创建一个对象&#xff0c;注意对象类型要一致&#xff0c;这样的操作的优势有两个&#xff1a; 1、不用花时间在找合适的空间存放新对象&#xff0c;…

华为云云耀云服务器L实例评测|使用华为云耀云服务器L实例的CentOS部署Docker并运行Tomcat应用

目录 前言 步骤1&#xff1a;登录到华为云耀云服务器L实例 步骤2&#xff1a;安装Docker 并验证Docker安装 步骤3&#xff1a;拉取Tomcat镜像并运行Tomcat容器 步骤4&#xff1a;放行8080端口 步骤5&#xff1a;访问tomcat 步骤6&#xff1a;管理Tomcat容器 小结 前言 …

【QT+CUDA】QT中使用cuda,QT+VS+cuda下载安装配置

文章目录 相关网址汇总&#xff1a; 一、软件安装&#xff1a;VS、CUDA、QT1 安装VS1.1 下载1.2 vs2017安装1.3 vs2015安装 2 安装CUDA2.1 下载2.2 安装2.3 测试2.4 卸载 3 安装QT3.1 下载3.2 安装 二、QT使用cuda1 .pro文件 三、常用操作1 NVIDIA控制面板&#xff1a;显卡、驱…

数据分析技能点-正态分布和其他变量分布

在数据驱动的世界里,了解和解释数据分布是至关重要的。不同类型的数据分布,如正态分布、二项分布和泊松分布,具有不同的特性和应用场景。这些分布不仅在统计学和数据科学中有广泛应用,而且在日常生活和商业决策中也起着关键作用。 文章目录 正态分布正态分布和偏差其他常见…

如何快速搭建一个react项目?如何使用react脚手架快速搭建项目?

如何使用react脚手架快速搭建项目&#xff1f; 一、前提 电脑已经安装了node和npm环境。 react文档中要求Node > 8.10 和 npm > 5.6&#xff0c;查看版本&#xff1a;node -v&#xff1b;npm -v&#xff1b; 二、步骤 1、在合适的文件夹中打开命令行窗口cmd 2、全局安…

【设计模式】六、建造者模式

文章目录 需求介绍角色应用实例建造者模式在 JDK 的应用和源码分析java.lang.StringBuilder 中的建造者模式 建造者模式的注意事项和细节 需求 需要建房子&#xff1a;这一过程为打桩、砌墙、封顶房子有各种各样的&#xff0c;比如普通房&#xff0c;高楼&#xff0c;别墅&…

C语言进阶---动态内存管理

动态内存管理 前言&#xff1a;一、为什么存在动态内存分配&#xff1f;二、动态内存函数的介绍1.数据在不同区域的储存&#xff1a;2、malloc和free3、calloc4、realloc 三、常见的动态内存错误1、对NULL指针的解引用操作2、对动态开辟空间的越界访问3、对非动态内存开辟的空间…

C# 集合

C# 集合 集合集合接口和类型列表队列栈链表有序表字典LoopupHashSet位数组 集合 数组的大小是固定的。如果元素个数是动态的&#xff0c;就应使用集合类。List 和 ArrayList 是与数组相当的集合类。还有其他类型的集合&#xff1a;队列、栈、链表和字典。 集合接口和类型 集…

无线振弦采集仪在岩土工程安全监测中优化成本支出

无线振弦采集仪在岩土工程安全监测中优化成本支出 随着城市的快速发展以及建筑业的不断壮大&#xff0c;岩土工程的安全监测变得越来越重要。在岩土工程中&#xff0c;振弦是一种重要的监测手段&#xff0c;可以有效地评估土体的力学性质和变形情况。因此&#xff0c;无线振弦…