冒泡排序和选择排序

目录

一、冒泡排序

1.冒泡排序的原理

2.实现冒泡排序

1.交换函数

2.单躺排序

3.冒泡排序实现

4.测试

5.升级冒泡排序

6.升级版代码

7.升级版测试

二、选择排序

1.选择排序的原理

2.实现选择排序

1.单躺排序

2.选择排序实现

3.测试

​4.修改

 5.测试


一、冒泡排序

1.冒泡排序的原理

1.从尾部开始比较相邻的两个元素,如果尾部的元素比前面的大,就交换两个元素的位置。这种方法是排升序的,想排降序的话,一旦尾部的元素比前面的小就交换即可

比方说,我有一个数组,里面存放的是9 6 3,这三个数字,我的尾部是下标为0的数,也就是9,往下走遇到了6,9比6大,所以交换,数组就会变为6 9 3

2.往前对每个相邻的元素都做这样的比较和交换,未排序中最大(最小)的那个数就会被排到未排序的数的最后

2.实现冒泡排序

1.交换函数

通过原理的讲解不难看出,冒泡排序要实现多次的交换,因此我们可以写一个简单的交换函数

void Swap(int* x, int* y)
{int tmp = *x;//创建中间变量储存x*x = *y;*y = tmp;
}

2.单躺排序

void BobbleSort(int* arr, int n)
//传递数组和数组元素个数
{int j = 0;for (j = 0; j < n - 1; j++)//j<n-1避免越界{if (arr[j] > arr[j + 1])//不断地进行比较,一遇到大的就进行交换,会将最大的数移动到数组的最后{Swap(&arr[j + 1], &arr[j]);}}
}

3.冒泡排序实现

一趟排好一个数,那么我们一共有n个数,那么循环次数就可以修改成n次

void BobbleSort(int*arr,int n)
//传递数组和数组元素个数
{int i = 0;int j = 0;for (i = 0; i < n; i++)//n次排序排n个数{for (j = 0; j < n - 1; j++)//j<n-1避免越界{if (arr[j] > arr[j + 1])//不断地进行比较,一遇到大的就进行交换,会将最大的数移动到数组的最后{Swap(&arr[j + 1], &arr[j]);}}}
}

4.测试

int main()
{int arr[] = { 9,6,7,5,2,3,4,1,8};int size = sizeof(arr) / sizeof(arr[0]);BobbleSort(arr,size);int i = 0;for (i = 0; i < size; i++){printf("%d ", arr[i]);}printf("\n");
}

5.升级冒泡排序

1.我们可以看出,每次我们进行完一趟排序后,未排序中最大(最小)的那个数就会被排到未排序的数的最后,因此我们没有必要去和那些已经排好序的数作比较,所以我们可以把单躺循环判断语句改写成j<n-i-1,i代表已经排好序的数的个数,减去i就可以避免与这些数重复的比较。

2.如果数组已经有序我们还在比较显然就会浪费大量的时间    可以看出,如果数组无序的话,那个未排序中最大(最小)的那个数就会被排到未排序的数的最后,期间一定会出现交换,而如果有序的话就一定不会出现交换。

因此我们可以通过一个flaw变量来实现,每次进行新的一趟排序前,先将flaw变量初始化为1,一旦发生交换就令它为0,再在最外面根据flaw来判断是否发生了交换,如果发生了交换,那么数组依然无序,若是没有,则有序,结束函数

6.升级版代码

void BobbleSort(int*arr,int n)
//传递数组和数组元素个数
{int i = 0;int j = 0;for (i = 0; i < n; i++)//n次排序排n个数{int flaw = 1;for (j = 0; j < n -i- 1; j++)//j<n-1避免越界{if (arr[j] > arr[j + 1])//不断地进行比较,一遇到大的就进行交换,会将最大的数移动到数组的最后{Swap(&arr[j + 1], &arr[j]);flaw = 0;}}if (flaw == 1){return;}}
}

7.升级版测试

二、选择排序

1.选择排序的原理

选择排序十分的简单粗暴,就是在数组中找到最大值和最小值,然后把它们放到对应的位置,如果你想排升序最大值放右边,最小值放左边,排降序相反即可。 

2.实现选择排序

1.单躺排序

第一趟排序我们找到最大值和最小值然后把它们放在对应的位置即可

void SelectSort(int*arr,int n)
{int max = 0;int min = 0;//max和min均储存下标int i = 0;for (i = 0; i < n; i++){if (arr[max] < arr[i]){max = i;}if (arr[min] > arr[i]){min = i;}}Swap(&arr[0] = &arr[min]);//将最小值放到最前面Swap(&arr[n-1],&arr[max]);//将最大值放到最后}

2.选择排序实现

思考要排几趟,可以看出,每次都会将最大和最小的排到对应的位置,那么,循环差不多就是for(j=0;j<n/2;j++); 但要不要带上等号呢。这个可以代入实例进行思考,比方说,一共有5个元素,你要给它进行两次排序即可,而5/2=2,j<2,进行2次循环,满足条件,一共有6个元素,要进行三次排序,6/2*3,j<3,进行3次循环,满足条件。奇偶数均检验,故无需带上等于号。

思考细节,每比较一次,我们需要比较的区间就会缩小。所以应将查找最大最小的循环修改成for(i=j;i<n-j;i++); 同理,max和min的下标也不能一直都是0,区间减小了,你却使用到区间之外的数,显然不对,max,min应初始化为j

void SelectSort(int* arr, int n)
{int i = 0; int j = 0;for (j = 0; j < n / 2; j++){int max = j; int min = j;//max和min均储存下标for (i = j; i < n - j; i++){if (arr[max] < arr[i]){max = i;}if (arr[min] > arr[i]){min = i;}}Swap(&arr[j], &arr[min]);//将最小值放到最前面Swap(&arr[n - 1 - j], &arr[max]);//将最大值放到最后}
}

3.测试

4.修改

为什么会出错呢,仔细思考,你会发现,若是max和j相等的话,j先和min进行交换,那么此时的j就不再是最大值的下标了,自然会出错,因此,当max和j相等的时候,应该在交换之后使max更新为min,更新到真正最大值的下标。

void SelectSort(int* arr, int n)
{int i = 0; int j = 0;for (j = 0; j <n / 2; j++){int max = j; int min = j;//max和min均储存下标for (i = j; i < n-j; i++){if (arr[max] < arr[i]){max = i;}if (arr[min] > arr[i]){min = i;}}Swap(&arr[j], &arr[min]);//将最小值放到最前面if (j == max)//更新{max = min;}Swap(&arr[n - 1 - j], &arr[max]);//将最大值放到最后}
}

 5.测试

至此,冒泡排序和选择排序讲解完成,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O

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

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

相关文章

MacBook 录制电脑内部声音

MacBook 录制电脑内部声音 老妈喜欢跳广场舞&#xff0c;现在广场舞音频下载都收费了&#xff01;没办法&#xff0c;只能自己录歌了&#xff0c;外录有杂音大家也都知道&#xff0c;所以就只能采用内录的方式然后再用 Audition 调整一下音量大小。 一、&#xff08;前置条件&a…

3.02 创建订单操作详细-订单创建与回滚 (创建订单操作详细)

步骤1&#xff1a; 创建orders订单表,子订单表和订单状态表对应的pojo和mappperOrders和OrderItemsMapperOrderItems和OrderItemsMapperOrderStatus和OrderStatusMapper步骤2&#xff1a;创建OrderService和对应的实现类 public interface OrderService {/*** 用于创建订单相关…

[Linux 命令] nm 详解

1. nm 命令&#xff1a; 显示关于指定 File 中符号的信息&#xff0c;文件可以是对象文件、可执行文件或对象文件库。如果文件没有包含符号信息&#xff0c;nm 命令报告该情况&#xff0c;但不把它解释为出错条件。 nm 命令缺省情况下报告十进制符号表示法下的数字值。 2. 命…

HVDC-MMC互连(1000MW,±320KV)使用聚合MMC模型进行优化的SPS模拟

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型概述&#xff1a; 本示例展示了一个SimPowerSystems&#xff08;SPS&#xff09;模型&#xff0c;使用基于模块化多电平变换器&#xff08;MMC&#xff09;技术的电压源换流器&#xff08;VSC&#xff09…

lua如何调用C/C++

1 lua vs C/C lua是脚本语言&#xff0c;优点是门槛低&#xff0c;可以热更新&#xff0c;缺点当然就是性能。C/C是编译型语言&#xff0c;有点是性能高&#xff0c;但是相对的&#xff0c;门槛高&#xff0c;技术不好的人写的代码可能还没有lua的性能高&#xff0c;容易出现c…

【AI视野·今日Robot 机器人论文速览 第四十九期】Fri, 6 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 6 Oct 2023 Totally 29 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;ContactGen, 基于生成模型的抓取手势生成&#xff0c;类人五指手。(from 伊利诺伊大学 香槟) 数据集&#xff1a;GRAB da…

docker系列6:docker安装redis

传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜像加速器 docker系列3&#xff1a;docker镜像基本命令 docker系列4&#xff1a;docker容器基本命令 docker系列5&#xff1a;docker安装nginx Docker安装redis 通过前面4节&#xff0c;对docke…

UVA - 10765 Doves and bombs

CUC DFS及其应用 - Virtual Judge 题目大意&#xff1a;有一个n个点的图&#xff0c;求每个点如果被删除后&#xff0c;图中剩余连通块的数量 1<n<1e4 思路&#xff1a;也就是求每一个割点出现在几个双联通分量&#xff08;没有割点的图&#xff09;中&#xff0c;找双…

HuggingFace Transformers教程(1)--使用AutoClass加载预训练实例

知识的搬运工又来啦 ☆*: .&#xff61;. o(≧▽≦)o .&#xff61;.:*☆ 【传送门>原文链接:】https://huggingface.co/docs/transformers/autoclass_tutorial &#x1f697;&#x1f693;&#x1f695;&#x1f6fa;&#x1f699;&#x1f6fb;&#x1f68c;&#x1f6…

【接口技术】输入输出接口

【输入输出接口概念】外设接口功能及其一般结构&#xff0c;I/O端口编址方式&#xff0c;输入/输出数据传送方式&#xff0c;端口译码技术 【输入/输出接口】 外部设备及其信号 外部设备 输入设备 输出设备 复合输入/输出设备 外部设备的信号 数据信号&#xff08;数字量…

自媒体工作内容管理助手

内容助手 访问地址&#xff1a;editor.yunwow.cn 背景介绍 最近在学习流量运营&#xff0c; 流量运营的第一站是内容创作&#xff0c; 我试过不少原创内容&#xff0c;都是跟生活相关的例如&#xff1a;录一段联琴的视频、录一段秋天的风景、写一段生活感悟、发一段小宠物的生…

Elasticsearch基础操作演示总结

一、索引操作 &#xff08;一&#xff09;创建索引 创建Elasticsearch&#xff08;ES&#xff09;索引是在ES中存储和管理数据的重要操作之一。索引是用于组织和检索文档的结构化数据存储。 当创建Elasticsearch索引时&#xff0c;通常需要同时指定索引的设置&#xff08;Se…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 2 - 改善深层神经网络 - 第三周测验

课程2_第3周_测验题 目录&#xff1a;目录 第一题 1.如果在大量的超参数中搜索最佳的参数值&#xff0c;那么应该尝试在网格中搜索而不是使用随机值&#xff0c;以便更系统的搜索&#xff0c;而不是依靠运气&#xff0c;请问这句话是正确的吗&#xff1f; A. 【  】对 B.…

电脑提示MSVCP100.dll丢失错误怎么解决?分享四个解决方法帮你搞定

在平时我们使用电脑中&#xff0c;经常会遇到各种问题&#xff0c;比如msvcp100.dll文件丢失&#xff0c;那这个msvcp100.dll文件丢失需要怎么修复解决呢&#xff1f;和msvcp100.dll为什么会丢失呢&#xff0c;下面我一点点为大家解答与介绍解决msvcp100.dll丢失问题的方法。 一…

HTML入门知识点

第一部分&#xff1a;HTML基础 HTML文档通常由以下几个部分组成&#xff1a; <!DOCTYPE html> 声明&#xff1a;这个声明告诉浏览器你使用的是HTML5标准。 <html> 元素&#xff1a;这是HTML文档的根元素&#xff0c;包含了整个文档的内容。 <head> 元素&a…

代码随想录day59

647. 回文子串 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#…

游戏引擎,脚本管理模块

编辑器中删除脚本&#xff0c;然后立即恢复删除的脚本关系正常编辑器中删除脚本&#xff0c;关掉编辑器&#xff0c;然后只恢复脚本&#xff0c;不恢复meta,然后再打开编辑器关系丢失编辑器中删除脚本&#xff0c;关掉编辑器&#xff0c;然后恢复脚本且恢复meta,然后再打开编辑…

为什么InnoDB选择B+树而不是红黑树作为索引结构?

在数据库管理系统中&#xff0c;索引结构的选择对于数据库的性能和效率至关重要。MySQL的InnoDB存储引擎是一个广泛使用的数据库引擎&#xff0c;它选择了B树作为索引结构&#xff0c;而不是像红黑树那样的其他数据结构。本文将探讨为什么InnoDB选择B树&#xff0c;并解释B树与…

Redisson—分布式服务

一、 分布式远程服务&#xff08;Remote Service&#xff09; 基于Redis的Java分布式远程服务&#xff0c;可以用来通过共享接口执行存在于另一个Redisson实例里的对象方法。换句话说就是通过Redis实现了Java的远程过程调用&#xff08;RPC&#xff09;。分布式远程服务基于可…

【JVM】运行时数据区(内存区域划分)详解

文章目录 前言一、JVM 运行时数据区1, 堆2, Java 虚拟机栈3, 本地方法栈4, 程序计数器5, 元数据区 / 方法区 二、内存异常问题1, 栈溢出2, 内存溢出3, 内存泄露 总结 前言 &#x1f4d5;各位读者好, 我是小陈, 这是我的个人主页 &#x1f4d7;小陈还在持续努力学习编程, 努力通…