排序(三)冒泡排序与快速排序(C语言实现)

2023-11-07

冒泡排序与快速排序都属于交换排序,其中冒泡排序也是十分的出名,实现起来也比较简便,下面一一介绍这两种排序。

1、冒泡排序

冒泡排序的意思就是将最大的数沉底,或者最小的数提到最前面来,之后再抛开这个数找次大或此次小的数进行循环,这个过程比较像泡泡从小变大的过程因此称作冒泡排序。

1bd6dcdf1d0e415e93037eec626b4d13.png

代码实现:

void BubbleSort(int* a, int n)
{
	assert(a);//断言判断
	for (int j = 0; j < n; j++)
	{
		int flag = 0;//用于提高循环效率,如果提前排序完成,则不用再继续进行比较
                     //置flag为1后便可跳出循环
		for (int i = 1; i < n - j; i++)
		{
			if (a[i - 1] > a[i])
				Swap(&a[i - 1], &a[i]);
			flag = 1;
		}
		if (flag == 0)
			break;
	}
}

2、快速排序

快速排序正如其名,效率非常的快,但是算法比较复杂,要求使用递归思想。

我们先来看单趟的排序过程:

首先要选定一个值为key(一般都选择数组最左端或最右端的值),让所有比key小的值在key左边,比key大的值在key右边(以下为升序思路)

41b8eea733e147cfb8cc6c4060d483dd.png

 这里取最左端的值为key,接下来就是先从右边开始依次遍历数组寻找比key小的数

01856a55fc774e0998eb50f994001b7c.png

 此时right所在下标的值比key大,则再从左边开始找比key大的数

8ec8f321820b47c68d61acbcc836a739.png

 交换left与right所对应的值

8788637b7c2b4f2da4b9d695b96ad996.png

 之后再重复以上步骤直到left与right相遇为止

e0a5c77a6338447dac03ce833565433a.png

最后将left所对应的值与key交换(如果选取左边为key一定要从右边开始找,这样可以保证left最后所在位置一定比key小或等于key)

ea07ccbe79394e0c93082e06c12564fa.png

这时整个数组被分为三个区间其所对应的下标分别是[begin,key-1]key[key+1,end],其中key所在位置不用再变化,而要分别对左右两个区间再进行单趟快速排序

左:

e0489b9325af42738818c01ed436100f.png

右:

764900fa93814947b14ea404c9a5cdb7.png

因为取的数据比较巧,也只花了一次就完成排序了,没有体验出一个递归的过程,不过我们可以思考如果这一次排完还是无序便又要拆分成左右区间继续排序,直到区间只剩一个数或者不存在为止。

那么用代码来实现一下:

void QuickSort(int* a, int begin, int end)
{
	//当区间只有一个值或不存在则不需要再处理
	if (begin >= end)
	{
		return;
	}
	int left = begin;
	int right = end;
	int key = left;

	while (left < right)
	{
		//右边先走,找小
		while (left < right && a[right] >= a[key])//这里是第一个判断条件是防止left不动,right一直向左走越界的情况
											   //第二个判断条件的等于号一定不能少,如果左右都与key相等会死循环
		{
			right--;
		}
		//左边再走,找大
		while (left < right && a[left] <= a[key])
		{
			left++;
		}
		Swap(&a[right], &a[left]);
	}
	Swap(&a[left], &a[key]);//key取左边,右边先走一定能保证结束循环后left所在位置的值比key小
	key = left;
	//[begin,key-1]key[key+1,end],此时需要让key左右区间分别有序
	QuickSort(a, begin, key - 1);
	QuickSort(a, key + 1, end);//递归思想
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序(三)冒泡排序与快速排序(C语言实现) 的相关文章

随机推荐

  • chatgpt赋能python:用Python三种方法逆序输出

    用Python三种方法逆序输出 Python是一种非常流行的编程语言 它的优雅和简单易用的特性使其成为开发人员和数据科学家的首选语言 今天 我们将讨论如何用Python三种方法逆序输出 方法一 使用 1 方法 Python列表的一个重要特性
  • ELK系列(三)、安装Logstash插件及打包离线安装包

    Logstash有input output filter codec 四种插件类型 支持的种类也很丰富 功能特别强大 选对正确的插件可以节省很多的资源占用和开发效率 生产环境一般都无法连接到公网 所以本篇就带大家如何在线安装 以及打包离线安
  • LSM树存储模型

    大规模分布式存储系统 原理解析与架构实战 读书笔记 之前研究了Bitcask存储模型 今天来看看LSM存储模型 两者虽然同属于基于键值的日志型存储模型 但是Bitcask使用哈希表建立索引 而LSM使用跳跃表建立索引 这一差别导致了两个存储
  • 基于python+opencv提取视频指定关键帧

    提取关键帧 不用遍历整个视频 第一步 打开视频文件 cap cv2 VideoCapture vedio 第二步 设置视频起始帧 cap set cv2 CAP PROP POS FRAMES keys frame keys frame为关
  • 【network】网口指示灯含义

    网卡有两个指示灯及含义 连接指示灯 绿色 连接指示灯亮就代表线路连接正常 信号指示灯 黄色 在连接指示灯亮的情况下 信号指示灯的含义如下 a 如果信号指示灯闪烁 代表信号正常 正在通信 b 如果信号指示灯灭 代表没有通信 c 如果信号指示灯
  • 大学生可以做的兼职有哪些?我收集了这份兼职指南,请查收

    大学生应该以学业为主 但是对即将踏入社会的你们 提前锻炼自身 多学习一项技能 无疑是对自己的一种 增值 其实大学生平常的业余时间都是被恋爱 游戏 影音占据了大半 有兼职想法的并不是太多 有这想法的多半是一些自立 有上进心的孩子 所以对这些大
  • snprintf函数的具体用法,解释参数,返回值,带示例

    文章目录 概述 函数签名如下 以下是一个简单的示例 总结 概述 snprintf 是一个 C 标准库函数 用于格式化字符串并将结果写入指定的字符数组中 以及控制最大写入的字符数 通过第二参数size 以防止缓冲区溢出 snprintf会自动
  • 深度学习的经典算法的论文、解读和代码实现

    文章目录 CNN网络的经典算法 LeNet 5 AlexNet VGG Inception Inception v1 GoogLeNet BN Inception ResNet R CNN R CNN Fast R CNN Faster R
  • 【转】卷积神经网络如何用在NLP上

    点击前往集智专栏阅读原文 原文 Understanding Convolutional Neural Networks for NLP 作者 Denny Britz 翻译 Kaiser 当我们听到 卷积神经网络 CNN 当然 不是特朗普说F
  • python3中无法import cv2,importError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so

    这个问题就是importError opt ros kinetic lib python2 7 dist packages cv2 so 为什么会出现这个问题 因为当初安装cv2的时候 默认弄在了Python2 所以导致这个错误的产生 解决
  • sample语言词法分析_【软件设计师】程序设计语言与语言处理程序!(第八章)...

    每天1章考点 助您自学通过软考 第8章 程序设计语言与语言处理程序基础 考点梳理 考点1 编译与解释 考法分析 1 本知识点的考查形式主要有 给出编译与解释相关的描述 判断正误 给出编译各个阶段的描述 判断正误 要点分析 1 解释程序 也称
  • webpack5 基本概念 —— 插件(plugin)

    插件 是 webpack 的 支柱 功能 Webpack 自身也是构建于在 webpack 配置中用到的 相同的插件系统 之上 插件目的在于解决 loader无法实现的其他事 如果在插件中使用了 webpack sources 的 pack
  • iphone 开启ipv6禁用ipv4_IPv6系列-初学者的10个常见困扰

    本文是 IPv6系列 文章的第二篇 常见困扰 紧接 入门指南 用于解答IPv6的10个常见困扰 小慢哥的原创文章 欢迎转载 目录 本文缘由 困扰1 IPv4和IPv6只有地址格式不同吗 困扰2 IPv4到IPv6对应用程序是透明无感知的吗
  • S​alesforce是怎么完成从0到1的?

    我之前写过无数篇Salesforce的文章 但是很多人还是想看看Salesforce如何从0到1以及从1到10的发展 所以我找来Salesforce的创始人在2009年 Salesforce成立十周年 之际亲自写的一本书 云攻略 来给大家梳
  • Git -将本地项目上传到gitee上

    1 首先你要有一个gitee账号且本地安装有git 2 找到并打开你的项目找到pom xml文件所在目录 右击空白处 点击git bash here git安装成功了一般就会有 3 初始化仓库 初始化完成后在此目录会出现 git 的文件 记
  • java运行一段时间连不上数据库_项目运行一段时候之后就会出现数据库连接被关闭的问题,...

    om jfinal plugin activerecord ActiveRecordException java sql SQLException Invalid state the Connection object is closed
  • Ubuntu小技巧16--常见命令使用方法

    Ubuntu小技巧16 常见命令使用方法 不知觉间Linux系统已用了好多年 各种命令和小工具也接触了若干个 各类笔记分布到各个系统上 可一直没来得及整理归档 最近决定开始慢慢整理linux相关的小工具和命令 把以前 现在和以后的笔记都陆续
  • 云服务器部署和维护,云服务器部署维护

    云服务器部署维护 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 服务器上云或云上迁移利用镜像导入功能 将已有的业务服务器
  • 1024程序员节的一些随笔

    转眼间又是一年程序员节 来CSDN已经三年了 之前两年的程序员节都错过 了 所以三年也没混的一个徽章 今年就不要再错过了吧 今年在CSDN是收获满满的一年 自己的文章逐渐被大家所接受 博客也慢慢变的热闹了起来 同时也在CSDN上认识了许多小
  • 排序(三)冒泡排序与快速排序(C语言实现)

    冒泡排序与快速排序都属于交换排序 其中冒泡排序也是十分的出名 实现起来也比较简便 下面一一介绍这两种排序 1 冒泡排序 冒泡排序的意思就是将最大的数沉底 或者最小的数提到最前面来 之后再抛开这个数找次大或此次小的数进行循环 这个过程比较像泡