冒泡排序与选择排序超详细讲解

news/2024/11/5 12:34:43/文章来源:https://www.cnblogs.com/GJ504b/p/18527589

冒泡排序与选择排序

冒泡排序

condition:输入5个数字,冒泡排序,逆序输出

#include<stdio.h>
int main(){int userInput,tmp,i,j,arr[6],flag;flag = 0;for(int i=0;i<5;i++){scanf("%d",&userInput);arr[i] = userInput;}//依次输入五个数字for(int i=0;i<4;i++){//五个数字只需要排序4趟for(int j=0;j<4-i;j++){//每一趟交换次数4-i次  第0趟 4次, 第1趟 3次 if(arr[j] < arr[j+1]){tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;flag = 1;//存在交换,更新flag}}if(flag == 0){break;}//不存在交换,结束!}for(int i=0;i<5;i++){printf("%d ",arr[i]);}return 0;//逆序输出
}
/*输入n个元素n小于20,冒泡排序,逆序输出*/
#include<stdio.h>
int main(){int n,a[20],flag = 0, i,j,tmp;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);}for(i=0;i<n-1;i++){for(j=0;j<n-i-1;j++){//一定是(n-1)-iif(a[j]<a[j+1]){tmp = a[j];a[j] = a[j+1];a[j+1] = tmp;flag = 1;}}if(flag == 0){break;}}for(i=0;i<n;i++){printf("%d ",a[i]);}return 0;
}

img

选择排序

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

/*选择排序*/
//5个数 由小到大 88 66 99 11 23
//1轮,4次
//就是固定第一位,将a0与其他项比较,比较完后保证a0最小或者最大
//2轮,3次
//a1与剩下的每一项比较
```c
//输入5个数字,选择排序,顺序输出
#include<stdio.h>
int main(){int userInput,tmp,i,j,arr[5];for(i=0;i<5;i++){scanf("%d",&userInput);arr[i] = userInput;}//依次输入五个数字for(i=0;i<4;i++){//五个数字只需要排序4趟for(j=i+1;j<5;j++){//这里j不再是交换的次数了,而是剩下数字的角标,因为前面的j就在变化if(arr[i] > arr[j]){//固定每一趟的第一个数字,然后和剩下的数字比较tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}}}for(i=0;i<5;i++){printf("%d ",arr[i]);}return 0;//顺序输出
}

历史错误:内层循环终止条件错误
交换逻辑错误:一发现arr[i] > arr[j]就交换,导致不必要交换
优化 --> 找到每一趟最小值的下标,每一趟结束后再arr[1]和arr[minIndex]交换

#include<stdio.h>int main() {int userInput, tmp, i, j, minIndex, arr[5];// 依次输入五个数字for (i = 0; i < 5; i++) {scanf("%d", &userInput);arr[i] = userInput;}// 选择排序for (i = 0; i < 5 - 1; i++) {  // 进行n - 1趟排序,这里n = 5minIndex = i;  // 先假设当前位置的元素就是最小的,记录其索引// 在内层循环中找到真正最小元素的索引for (j = i + 1; j < 5; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}// 如果找到的最小元素索引不是当前假设的索引,就进行交换if (minIndex!= i) {tmp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = tmp;}}// 顺序输出for (i = 0; i < 5; i++) {printf("%d ", arr[i]);}return 0;
}
/*输入n个元素n小于20,选择排序,逆序输出*/
#include<stdio.h>
int main(){int n,a[20], i,j,tmp,maxIndex;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);}for(i=0;i<n-1;i++){maxIndex = i;for(j=i+1;j<n;j++){if(a[j]>a[maxIndex]){maxIndex = j;}if(maxIndex != i){tmp = a[i];a[i] = a[maxIndex];a[maxIndex] = tmp;}}}for(i=0;i<n;i++){printf("%d ",a[i]);}return 0;
}

img

总结

  • 冒泡排序【每趟保证数组最右端最值元素归位】
    冒泡排序就是它重复地走访要排序的数列,一次比较两个相邻的元素,根据规则进行一定的交换,保证每一趟完成后,最值数在序列的最右端
    核心关注点
    总趟数 === number-1【最后一趟已经有序】
    相邻元素交换冒泡至最右端
    默认趟数从0开始
    交换总次数 === (number-1-i) [两两交换,次数=number-1-i]
    每趟交换次数== number-1(i===第几趟)
  • 选择排序【每趟保证数组最左端最值元素归位】
    首先固定每趟的第一个元素,假设它是最值
    再在这一趟里比较剩下的元素找到最值元素 看是否为第一个假设元素
    不是就交换
    loop

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

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

相关文章

【前端】六款高颜值登录页面

原创 吴旭东 无限大infinity第一款–简约风格HTML: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0">…

【前端】六款高颜值注册界面

原创 吴旭东 无限大infinity 和昨天的一样,带来了六款注册界面,可复制源码(需要定制请加微信) 第一款–简约风格HTML: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport…

硬盘开机报错是什么原因引起的

硬盘开机报错可能由多种原因引起,以下是一些常见的原因及相应的解决方法: 一、硬件连接问题 数据线松动或损坏: 外部硬盘:检查USB线是否插紧,尝试更换USB线或连接到其他USB端口。 内部硬盘:检查数据线和电源线是否牢固连接,确保没有松动。 接口灰尘或损坏: 清洁主板上的…

PHPStudy 安装tp8 php8.1.3 安装XDbug、redis扩展

1.1 下载php安装包 https://windows.php.net/download/1.2 下载的的安装包1.3 解压 解压到D:\phpstudypro\Extensions\php\php8.1.3nts1.4 修改php8.1.3的php.ini文件 将php8.1.3nts目录下的php.ini-development文件复职一份并改文件名为 php.ini 。然后可以将php.ini里面的内容…

pyspark建模(类似于dwd层),flask直接对接前端请求进行召回(类似于ads层,但是不保存)

2. Spark MLib 2.1 Spark MLib 开发环境准备 2.1.1 配置python和spark环境 安装Python环境 安装Anaconda3-5.2.0-Windows-x86_64.exe配置环境变量Anaconda_HOME E:\20241014_Soft\Anaconda3PATH %Anaconda_HOME%Scripts;%Anaconda_HOME%Library\mingw-w64\bin;%Anaconda_HOME…

征程 6E camera diag sample

01 功能概述 本文的 demo sample 主要描述当前 camera 相关外设诊断的当前状态,并提供自定义实现的方法及使用说明。 1.1 软件架构说明 本 sample 基于现已实现的 camera 诊断架构,libcam 内的外设诊断功能对外设硬件状态进行监测,并支持将故障状态发送给 MCU 处理,或通过事…

实时数仓及olap可视化构建(基于mysql,将maxwell改成seatunnel可以快速达成异构数据源实时同步)

1. OLAP可视化实现(需要提前整合版本)Linux121 Linux122 Linux123jupyter✔spark ✔ ✔ ✔python3+SuperSet3.0✔hive✔ClinckHouse✔Kafka ✔ ✔ ✔Phoenix ✔DataX ✔maxwell✔Hadoop ✔ ✔ ✔MySQL✔ZK ✔ ✔ ✔HBASE ✔ ✔ ✔1.1 安装Vmware,安装虚拟机集群 1.1.1 安装 …

AI运动小程序开发常见问题集锦二

截止到现在写博文时,我们的AI运动识别小程序插件已经迭代了23个版本,成功应用于健身、体育、体测、AR互动等场景;为了让正在集成或者计划进行功能扩展优化的用户,少走弯路、投入更少的开发资源,针对近期的咨询问题,我们又归集了一些常见问题,供大家参考。一、计时、计数…

synchronized的monitor监视器

public class T {@SneakyThrowspublic static void main(String[] args) {System.out.println("此行后加锁 monitorenter");synchronized (T.class){System.out.println("hello monitor");}System.out.println("此行前释放锁 monitorexit");}}反…

31 计算机安全

计算机安全是保护系统和数据的,完整,保密,可用 保密:有权限的人才能读取数据;泄露信息就是攻击保密性(看不看得到)---窃取信息 完整性:能够修改数据,知道密码进入操作-----------------------------------获取权限 可用性:有权限的人应该能随时访问,黑客发大量请求到…

大话USB PD快充电源功率“协商”

啥叫USB PD快充技术? USB PD快充技术就是通过USB接口对对USB设备进行快速充电的一项技术。 由于USB技术的发展,特别的USB TYPE-C接口的广泛应用,基于USB TYPE-C接口的USB PD快充技术越来越成为主流。 使用USB TYPE-C接口的技术可以给谁充电?可以给我们的手机充电 可以给笔记…

瑞芯微RK3568开发板Linux编译报错404怎么办触觉智能教你轻松解决

本文介绍瑞芯微RK3568主板/开发板SDK编译流程和编译报错的解决方法,使用触觉智能EVB3568鸿蒙开发板演示,具有丰富的视频输入输出接口(HDMI/eDP/MIPI/LVDS) 与多种高速接口(千兆网口/PCIe/SATA/CAN等)。近期,触觉智能即将发布RK3568系列开源鸿蒙OpenHarmony5.0系统固件,敬…