交换类排序包括冒泡排序和快速排序两种。

冒泡排序

        基本介绍

        冒泡排序是通过重复比较相邻元素并交换位置实现排序。其核心思想是每一轮遍历将未排序序列中的最大(或最小)元素"浮动"到正确位置,类似气泡上升。

        基本过程是从序列起始位置开始,逐个比较相邻的两个元素,以升序为例,若左边的元素大于右边的元素则交换两个元素的位置,每轮遍历之后都会使一个最大元素移动到最右边,在下一轮遍历时就无需再考虑这个元素。

        实现过程

        以升序为例,从起始位置开始遍历,2 < 5,无需交换,5 < 8,无需交换,8 > 3,需要交换。

         交换之后继续比较8,6,8 > 6,需要交换

         交换之后继续比较,8 < 9,无需交换,继续比较,9 > 1,需要交换

         交换之后继续比较,9 > 4,需要交换

        交换之后继续比较,9 > 7,需要交换 

        最终完成一轮遍历,将最大的元素移到了右边,然后继续后续遍历,后续遍历则不用再考虑9了,再找出一个最大值移到右边,进行size - 1次遍历即可完成排序。 

        代码展示

#include <stdio.h>int array[10] = {2,5,8,3,6,9,1,4,7};void sort(int *a,int len)
{//len个元素需要排序len - 1次for (int i = 0; i < len - 1; i++){//单轮循环可以找出来一个最大/最小并移到边上,下一轮循环就不考虑该元素,len - 1次之后只剩下一个元素,无需排序for (int j = 0; j < len - i - 1; j++){if(a[j] > a[j + 1]){int tmp = a[j];a[j] = a[j + 1];a[j + 1] = tmp;}}//打印每轮排序的结果for (int j = 0; j < len; j++){printf("%d ",a[j]);}printf("\n");}}int main(int argc, char const *argv[])
{sort(array,9);return 0;
}

        代码优化 

        如果在排序过程中,我们发现在某一次遍历过程中都没有发生元素交换,那么我们就可以认为序列已经排序完成,此时没有必要遍历size - 1次。遍历size - 1次一定可以使序列有序,但是有些序列执行更少次数的遍历就已经有序了。所以我们可以减少这些无意义的遍历,设置一个标志位swap_flag来记录遍历过程中是否发生了交换,若无交换则提前结束排序。

#include <stdio.h>int array[10] = {2,5,8,3,6,9,1,4,7};void sort(int *a,int len)
{//len个元素需要排序len - 1次for (int i = 0; i < len - 1; i++){//记录该轮循环是否发生了交换int swap_flag = 0;//单轮循环可以找出来一个最大/最小并移到边上,下一轮循环就不考虑该元素,len - 1次之后只剩下一个元素,无需排序for (int j = 0; j < len - i - 1; j++){if(a[j] > a[j + 1]){int tmp = a[j];a[j] = a[j + 1];a[j + 1] = tmp;swap_flag = 1;}}//如果本轮循环没有发生交换,则已经全部有序,跳出循环。if(swap_flag == 0)break;for (int j = 0; j < len; j++){printf("%d ",a[j]);}printf("\n");}}int main(int argc, char const *argv[])
{sort(array,9);return 0;
}

       优化效果对比

        未经优化的冒泡排序运行结果如下,完整进行了8次(size - 1)遍历。

        经优化的冒泡排序运行结果如下,进行了7次遍历,对于不同的序列,优化效果有所不同。运行结果仅打印了6次是因为break写在了打印之前,排序完成之后的后一次遍历才能检测到排序已完成。

 快速排序

        基本介绍

        快速排序的思想是通过一个基准值,把一组数据分成两个部分(一边小,一边大),然后,在对两个部分,分别找一个基准值,再次进行排序,直至每一个小部分不可再分,所得到的整个数组就成为了有序数组。

        快速排序的基本过程是先选择一个数作为基准值 (这里用的是第一个数,key),进行一次排序,(以升序为例)然后将所有比'基准值小的数'放在基准值的'左边', 将所有比'基准值大的数'放在基准值的'右边',然后再对两边的,各自'再取一个数作为基准值',然后再次排序(递归[自己调自己])。

        实现过程

        定义两个指示器,low和high,分别指向首尾。定义一个i,j分别指向low和high,用于遍历。

         从 j 开始逐个向左开始和基准值相比较。7大于key,不移动,4 > key,不移动,1 < key,要移动到左边。由于已经用key保存了基准值,所以放到左边是可以直接在a[i]处赋值。

        之后再从左边开始,1 < key,不动,5 > key,需要移动到右边,直接在右边赋值为5即可。放在这里的原因是因为这里的元素已经在前面被移动到了其他位置,不用担心数据丢失,而且下标位置也属于右边。

        这样完成一轮之后,发现一开始不符合规律的5已经移到了右边,不符合规律的1已经移到了左边。然后继续移动指示器,寻找不符合规律的元素。从 j 处继续,9 > key,不移动,6 > key,不移动,3 > key,不移动,8 > key,不移动,比较完8之后,发现 i 已经等于 j 了,此时结束,发现基准值应该插入到 i  、 j 处,在i 、j 处插入基准值。

         然后我们发现,基准值2的左边都比他小,右边都比他大,就以基准值为界限,分为了两部分。

        然后再对左边和右边分别找基准值再进行排序,之后再对分成的两部分排序,一直递归,直到不可再分为止。

        递归最重要的是要找到终止条件,否则就会一直套娃,这里的终止条件是不可再分,不可再分具体表现在哪呢?在本例中,进行一轮之后,以2为界限分为左右两部分,左边部分是[low,i - 1],右边部分是[i + 1,high],不可再分就代表只有一个元素,即low = i - 1,i + 1 = high时就是不可再分,再加上一个数学限制条件,low应该小于i - 1,所以最终的终止条件是low >= i-1和high <= i+1.

         代码展示

#include <stdio.h>int array[10] = {2,5,8,3,6,9,1,4,7};void quick_sort(int *a,int low,int high)
{//定义两端的下标int i = low,j = high;//选择一个基准值,这里选择第一个元素int key = a[i];//循环之后的结果是,比基准值小的都放在左边,比基准值大的都放在右边//同时i,j都在向中间靠近,当i = j时循环跳出,就找到了区分左右的边界(i、j)//之后a[i] = key是将基准值放在中间的分界。//条件设置为i < j就是因为当i,j相遇时,即找到了分界线的位置(i、j),然后将基准值插入到这个位置上//外层循环一次的结果是将不属于两边的元素互换(比如位于左边但是没有小于基准值)while (i < j){//从右边开始,右边的元素应比基准值大,寻找不符合的元素while (i < j && a[j] >= key)j--;//将不符合的元素放到左边,直接覆盖是因为://第一次循环,a[i]是基准值,已经用key保存,所以可以覆盖//之后的循环,a[i]也是不符合条件的元素,已经在上一次循环中被移动,所以可以覆盖a[i] = a[j];//从左边开始,左边的元素应比基准值小,寻找不符合的元素while (i < j && a[i] <= key)i++;//将不符合的元素放到右边,直接覆盖是因为a[j]的值已经在上边被移动了。a[j] = a[i];}//循环结束,i,j相遇//上述循环中,由于基准值已经用key保存了,所以其所在位置充当了一个交换缓冲的角色,//a[i],a[j]的每次移动都让自己之前的地方成为了下一个移动的目的地a[i] = key;//对基准值左右两边的元素再进行快排,直到无法再分//i,j的位置就是基准值,左边就是[low,i - 1],右边就是[i + 1,high]//不可再分的条件就是i - 1 和 low不满足i - 1 > low,i + 1 和 high不满足i + 1 < highif(i - 1 > low)quick_sort(a,low,i - 1);if(i + 1 < high)quick_sort(a,i + 1,high);
}int main(int argc, char const *argv[])
{quick_sort(array,0,8);for (int j = 0; j < 9; j++){printf("%d ",array[j]);}printf("\n");return 0;
}

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

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

相关文章

嵌入式 Linux开发环境构建之Source Insight 的安装和使用

目录 一、Source Insight 的安装 二、Source Insight 使用 一、Source Insight 的安装 这个软件是代码编辑和查看软件&#xff0c;打开开发板光盘软件&#xff0c;然后右键选择以管理员身份运行这个安装包。在弹出来的安装向导里面点击 next &#xff0c;如下图所示。这里选择…

【字节跳动】数据挖掘面试题0016:解释AUC的定义,它解决了什么问题,优缺点是什么,并说出工业界如何计算AUC。

文章大纲 AUC(Area Under the Curve)详解一、定义:AUC是什么?二、解决了什么问题?三、优缺点分析四、工业界大规模计算AUC的方法1. 标准计算(小数据)2. 工业级大规模计算方案3.工业界最佳实践4.工业界方案选型建议总结:AUC的本质AUC(Area Under the Curve)详解 一、…

Python后端项目之:我为什么使用pdm+uv

在试用了一段时间的uv和pdm之后&#xff0c;上个月(2025.06)开始&#xff0c;逐步把用了几年的poetry替换成了pdmuv&#xff08;pipx install pdm uv && pdm config use_uv true) ## 为什么poetry -> pdm: 1. 通过ssh连接到服务器并使用poetry shell激活虚拟环境之…

鸿蒙Next开发,配置Navigation的Route

1. 通过router_map.json配置文件进行 创建页面配置router_map.json {"routerMap": [{"name": "StateExamplePage","pageSourceFile": "src/main/ets/pages/state/StateExamplePage.ets","buildFunction": "P…

在 GitHub 上创建私有仓库

一、在 GitHub 上创建私有仓库打开 GitHub官网 并登录。点击右上角的 “” → 选择 “New repository”。填写以下内容&#xff1a; Repository name&#xff1a;仓库名称&#xff0c;例如 my-private-repo。Description&#xff1a;可选&#xff0c;仓库描述。Visibility&…

量产技巧之RK3588 Android12默认移除导航栏状态栏​

本文介绍使用源码编译默认去掉导航栏/状态栏方法,以触觉智能EVB3588开发板演示&#xff0c;Android12系统&#xff0c;搭载了瑞芯微RK3588芯片&#xff0c;该开发板是核心板加底板设计&#xff0c;音视频接口、通信接口等各类接口一应俱全&#xff0c;可帮助企业提高产品开发效…

Conda 安装与配置详解及常见问题解决

《Conda 安装与配置详解及常见问题解决》 安装 Conda 有两种主流方式&#xff0c;分别是安装 Miniconda&#xff08;轻量级&#xff09;和 Anaconda&#xff08;包含常用数据科学包&#xff09;。下面为你详细介绍安装步骤和注意要点。 一、安装 Miniconda&#xff08;推荐&a…

Linux ——lastb定时备份清理

lastb 命令显示的是系统中 /var/log/btmp 文件中的SSH 登录失败记录。你可以像处理 wtmp 那样&#xff0c;对 btmp 文件进行备份与清理。✅ 一、备份 lastb 数据cp /var/log/btmp /var/log/btmp.backup.$(date %F)会保存为如 /var/log/btmp.backup.2025-07-14✅ 二、清空 lastb…

自定义类型 - 联合体与枚举(百度笔试题算法优化)

目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合练习二、枚举类型2.1 枚举类型的声明2.2 枚举类型的优点总结一、联合体 1.1 联合体类型的声明 像结构体一样&#xff0c;联合体也是由一个或者多个成员构成…

FS820R08A6P2LB——英飞凌高性能IGBT模块,驱动高效能源未来!

产品概述FS820R08A6P2LB 是英飞凌&#xff08;Infineon&#xff09;推出的一款高性能、高可靠性IGBT功率模块&#xff0c;采用先进的EconoDUAL™ 3封装&#xff0c;专为大功率工业应用设计。该模块集成了IGBT&#xff08;绝缘栅双极型晶体管&#xff09;和二极管&#xff0c;适…

python学智能算法(十八)|SVM基础概念-向量点积

引言 前序学习进程中&#xff0c;已经对向量的基础定义有所了解&#xff0c;已经知晓了向量的值和方向向量的定义&#xff0c;学习链接如下&#xff1a; 向量的值和方向 在此基础上&#xff0c;本文进一步学习向量点积。 向量点积 向量点积运算规则&#xff0c;我们在中学阶…

【windows办公小助手】比文档编辑器更好用的Notepad++轻量编辑器

Notepad 中文版软件下载&#xff1a;这个路径总是显示有百度无法下载&#xff0c;不推荐 更新&#xff1a;推荐下载路径 https://github.com/notepad-plus-plus/notepad-plus-plus/releases 参考博主&#xff1a;Notepad的安装与使用

2025年7月12日全国青少年信息素养大赛图形化(Scratch)编程小学高年级组复赛真题+答案解析

2025年7月12日全国青少年信息素养大赛图形化(Scratch)编程小学高年级组复赛真题+答案解析 选择题 题目一 运行如图所示的程序,舞台上一共会出现多少只小猫呢?( ) A. 5 B. 6 C. 7 D. 8 正确答案: B 答案解析: 程序中“当绿旗被点击”后,角色先移到指定位置,然后“重…

对于独热编码余弦相似度结果为0和词向量解决了词之间相似性问题的理解

文章目录深入理解简单案例结论词向量&#xff08;Word Embedding&#xff09;简介词向量如何解决相似性问题&#xff1f;简单案例&#xff1a;基于上下文的词向量训练总结对于独热表示的向量&#xff0c;如果采用余弦相似度计算向量间的相似度&#xff0c;可以明显的发现任意两…

数据结构·数状数组(BIT)

树状数组(Binary Index Tree) 英文名&#xff1a;使用二进制下标的树结构 理解&#xff1a;这个树实际上用数组来存&#xff0c;二进制下标就是将正常的下标拆为二进制来看。 求x的最低位1的函数lowbit&#xff08;x&#xff09; 假设x的二进制表示为x ...10000&#xff0c;…

uniapp video视频全屏播放后退出,页面字体变大,样式混乱问题

uniapp官方的说法是因为页面使用rpx&#xff0c;但是全屏和退出全屏自动计算屏幕尺寸不支持rpx&#xff0c;建议使用px。但是因为uniapp端的开发都是使用rpx作为屏幕尺寸计算参数&#xff0c;不可能因为video全屏播放功能就整个全部修改&#xff0c;工作量大&#xff0c;耗时耗…

重复频率较高的广告为何一直在被使用?

在日常生活中&#xff0c;重复评率较高的洗脑广告我们时常能够碰到。广告的本质是信息传递&#xff0c;而重复频率较高的广告往往可以通过洗脑式的传播方式来提升传播效率。下面就让我们一同来了解下&#xff0c;为何这类广告一直受到企业的青睐。一、语义凝练高频率广告的内容…

内容管理系统指南:企业内容运营的核心引擎

内容管理看似简单&#xff0c;实际上随着内容量的激增&#xff0c;管理难度也逐步提升。尤其是在面对大量页面、图文、视频资料等数字内容时&#xff0c;没有专业工具的支持&#xff0c;效率与准确性都会受到挑战。此时&#xff0c;内容管理系统&#xff08;CMS&#xff09;应运…

文献查找任务及其方法

1. 必备网站&#xff1a; 谷歌学术 Web of Science Engineering Village CNKI翻译助手 科研通 2. 任务 学术上的一个调研&#xff0c;自动驾驶 3d 目标检测 方向的近7年的方法&#xff0c;模态&#xff08;相机/雷达/相机雷达 等&#xff09;&#xff0c;及其使用的数据集&a…

鸿蒙的NDK开发初级入门篇

初级必备的知识&#xff1a; NDK开发在什么时候用&#xff1f; 答&#xff1a;&#xff1a;NDK 开发在帮助应用提升性能的情况下使用&#xff0c;比如游戏开发&#xff0c;和硬件交互的场景中。 还有一个公司已经有标准的C或C库&#xff0c;不想在开发ArkTS的代码前提下。 开发…