比较冒泡排序、选择排序和快速排序的时间(C语言实现)

2023-05-16

文章目录

  • 前言
    • 代码设计
    • 代码实现
    • 运行结果
    • 结果分析
    • 稳定性测试
  • 总结


前言

本文主要比较冒泡排序、快速排序、选择排序的时间。


冒泡排序和快速排序的思想可以参考我转载的以下博文:
https://blog.csdn.net/gogo0707/article/details/124388314

代码设计

随机生成10000个随机数,进行冒泡排序、选择排序和快速排序,并比较时间;

本设计中使用clock函数获取cpu运行时间,排序后的cpu clock数减去排序前的cpu clock数,就可以得到排序消耗的cpu clock数。

代码实现

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <stdbool.h>

//随机生成10000个随机数,进行冒泡排序和快速排序,并比较时间。

//冒泡排序
void BubbleSort(int *a, int length) 
{
	int temp;
	for (int i = 0; i < length - 1; i++)
	{
		for (int j = 0; j < length - i - 1; j++)
		{
			if (a[j] > a[j + 1])
			{
				
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
}

//快速排序
void QuickSort(int *arr, int low, int high)  
{
	if (low < high)
	{
		int i = low;
		int j = high;
		int k = arr[low];
		while (i < j)
		{
			while (i < j && arr[j] >= k)     // 从右向左找第一个小于k的数
			{
				j--;
			}
 
			if (i < j)
			{
				arr[i++] = arr[j];
			}
 
			while (i < j && arr[i] < k)      // 从左向右找第一个大于等于k的数
			{
				i++;
			}
 
			if (i < j)
			{
				arr[j--] = arr[i];
			}
		}
 
		arr[i] = k;
 
		// 递归调用
		QuickSort(arr, low, i - 1);     // 排序k左边
		QuickSort(arr, i + 1, high);    // 排序k右边
	}
}
 
//选择排序(这里采用的是非稳定版本)
void select_sort(int *array, int size)
{
	int max;
	int pos;
	int i,j;
	int tmp;

	for(i = 0; i < size-1; i++)	//循环一次就找到一个较大的数,然后与数组的第n个数据交换位置(n从0开始)
	{
		max = array[i];
		pos = i;
		for(j = i; j <= size-1; j++)
		{
			if(array[j] > max)
			{
				max = array[j];
				pos = j;
			}
		}
		//直接交换数据,会改变同值数据的顺序,所以是非稳定版本
		tmp = array[i];
	    array[i] = array[pos];
		array[pos] = tmp;
	}
}

//冒泡排序改良版
void BubbleSortNew(int *a, int length) 
{
	int temp;
	//记录最后一次交换的位置
	int last_exchange_index = 0;
	//无序数列的边界,每次比较只需要比到这里	
	int sort_border = length - 1;

	for (int i = 0; i < length - 1; i++)
	{
		bool isSorted = true;
		for (int j = 0; j < sort_border; j++)
		{
			if (a[j] > a[j + 1])
			{
				isSorted = false;	//有数据要交换位置,所以不是有序,标志置为false 
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
				last_exchange_index = j;
			}
		}
		sort_border = last_exchange_index;
		if(isSorted)	//一轮下来是否发生数据交换,没有就退出排序
			break;
	}
}


int main(void)
{
	int num[10000]; 
 

 	srand(time(0));
	for (int i = 0; i<10000; i++)
	{
		
		num[i] = rand() % 10000;
		
	}

	clock_t start = clock();
	BubbleSort(num, 10000);		//冒泡排序测试
	clock_t end = clock();
	
	printf("使用冒泡排序花费了 %ld  cpu clock\n", (end - start));//<-
	getchar();
 
 	for (int i = 0; i<10000; i++)
	{
		
		num[i] = rand() % 10000;
		
	}

	clock_t start4 = clock();
	BubbleSortNew(num, 10000);		//冒泡排序改良版测试
	clock_t end4 = clock();
	
	printf("使用改良版冒泡排序花费了 %ld  cpu clock\n", (end4 - start4));//<-
	getchar();

 
 
 	for (int i = 0; i<10000; i++)
	{
		
		num[i] = rand() % 10000;
		
	}
	
	clock_t start2 = clock();
	QuickSort(num, 0, 9999);				//快排测试
	clock_t end2 = clock();
	
	printf("使用快速排序花费了 %ld cpu clock\n", (end2 - start2));//<-
	getchar();
	
	for (int i = 0; i<10000; i++)
	{
		
		num[i] = rand() % 10000;
		
	}
 
	clock_t start3 = clock();
	select_sort(num, 10000);	//选择排序测试
	clock_t end3 = clock();
	
	printf("使用选择排序(非稳定版本)花费了 %ld  cpu clock\n", (end3 - start3));//<-
	getchar();
 
}

运行结果

zzc@zzc-virtual-machine:~/share$ ./2
使用冒泡排序花费了 162699  cpu clock

使用改良版冒泡排序花费了 151667  cpu clock

使用快速排序花费了 724 cpu clock

使用选择排序(非稳定版本)花费了 54151  cpu clock

结果分析

  1. 从运行结果可以看出,快速排序用时最短,冒泡排序用时最长,两者相差了几个数量级;
  2. 改良后的冒泡比传统的冒泡用时有所减少;
  3. 选择排序(非稳定版本)用时比冒泡排序短了近3倍

稳定性测试

做3个测试:
第1个测试,数组(有10000个数据)通过随机数产生,随机数的范围指定为0到9999;
第2个测试,数组(有10000个数据)通过随机数产生,随机数的范围指定为0到99;
第3个测试,数组(有10000个数据)通过随机数产生,随机数的范围指定为0到9;

观察并比较各排序算法用时的变化。

第一个测试结果如下:

算法测试总次数平时用时(clocks)
冒泡10144900
改良冒泡10152,129
选择(非稳定)1054629
快排10773

第二个测试结果如下:

算法测试总次数平时用时(clocks)
冒泡10159,981
改良后冒泡10152,100
选择(非稳定)1054,835
快排101,081

第三个测试结果如下:

算法测试总次数平时用时(clocks)
冒泡10149,306
改良后冒泡10141,439
选择(非稳定)1054,233
快排105,876

从测试结果可以计算出相差不同数量级(以第一个测试为基准)下各算法用时的变化率,如下表:

算法相差2个数量级,排序时间的变化率相差3个数量级,排序时间的变化率
冒泡10.41%3.04%
改良后冒泡-0.07%-7.03%
选择(非稳定)0.38%-0.72%
快排39.84%660.16%

综上,可以发现待排序的数据的关联性对快速排序影响很大,排序时间波动很大;
而冒泡排序受到的影响相对较小,排序时间比较稳定。

总结

  1. 快速排序虽然用时较短,但是压栈严重,容易造成堆栈溢出,稳定性较差。
  2. 冒泡排序虽然平均时间复杂度比较大,但是算法比较稳定。
  3. 上述测试中选择排序使用的是非稳定版本,虽然用时较短,但要考虑实际应用时同值数据的顺序有无要求,如有要求,请使用稳定版本。

以上测试的测试量不够大,只能体现出一些变化规律。

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

比较冒泡排序、选择排序和快速排序的时间(C语言实现) 的相关文章

  • 【C、C++系列-1】C语言实现:寻找[1,100]之间的素数

    C C 43 43 系列 1 C语言实现 xff1a 寻找 1 100 之间的素数 1 问题 C语言实现 xff1a 寻找 1 100 之间的素数 2 实现代码 span class token comment 寻找 1 100 之间的素数
  • C语言实现strlen()函数

    方式一 xff1a span class token macro property span class token directive keyword define span CRT SECURE NO WARNINGS span spa
  • MergeSort(迭代归并排序)——C语言实现

    前言 xff1a 归并排序跟快速排序有异曲同工之妙 xff0c 都是分治法的典型代表 但是这种分治法都有不小的弊端 xff0c 就是需要占用大量的系统栈 xff0c 很容易造成空间的大量浪费 xff0c 所以就有用迭代来优化递归的操作 这次
  • 辗转相除法详解(C语言实现)

    辗转相除法 定义基本原理原理证明 算法实现思想C语言实现 定义 辗转相除法 xff0c 被称为欧几里得 xff08 Euclidean xff09 算法 xff0c 是求最大公约数的算法 基本原理 原理 两个正整数a和b a gt b xf
  • 选择排序算法(C语言实现)

    include lt stdio h gt void choice int a int n int i j temp for i 61 0 i lt n 1 i 43 43 for j 61 i 43 1 j lt n j 43 43 if
  • R语言实战——主成分分析理论推导与R语言实现

    目录 1 总体主成分1 1 主成分的定义与导出1 2 主成分的性质1 3 从相关矩阵出发求主成分 2 样本主成分2 1 从S出发求主成分2 2 从R出发求主成分 3 相关的R函数以及实例3 1 96 princomp 96 函数3 2 96
  • 贝叶斯网络python实现_朴素贝叶斯和贝叶斯网络算法及其R语言实现

    原标题 xff1a 朴素贝叶斯和贝叶斯网络算法及其R语言实现 作者 xff1a 鲁伟 一个数据科学践行者的学习日记 数据挖掘与机器学习 xff0c R与Python xff0c 理论与实践并行 个人公众号 xff1a 数据科学家养成记 微信
  • C语言实现 Josegh()函数

    问题 设有n个人围坐一圈并按顺时针方向从1到n编号 xff0c 从第s个人开始进行1到m的报数 xff0c 报数到第m个人 xff0c 此人出圈 xff0c 再从他的下一个人重新开始1到m的报数 xff0c 如此下去直到所有的人都出圈为止
  • 用C语言实现websocket服务器

    Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成 xff0c 我去研究如何用C语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的功能 xff0c 用户通过网
  • 无名的ADRC的C语言实现

    分为ADRC h和ADRC c 确实看头文件有用 xff0c 有哪些变量都一目了然 和ACfly一样的是比如都有beta这个参数 ADRC c 本程序只供购买者学习使用 xff0c 版权著作权属于无名科创团队 xff0c 无名科创团队将飞控
  • c语言实现FTP

    这个实现了客户端和服务端文件的相互传输 xff08 只在本机上运行过 xff09 xff0c 如果是要两台计算机相互传数据要改ip 给大家看一下实现过程 xff08 exe文件要先开服务端的 xff09 输入1 直接将快捷方式拖拽上去就有绝
  • 汉诺塔问题(C语言实现)

    前言 一 汉诺塔圆盘的移动步数 二 汉诺塔圆盘移动步骤 总结 前言 汉诺塔 xff08 Tower of Hanoi xff09 xff0c 又称河内塔 xff0c 是一个源于印度古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子
  • 使用Verilog HDL语言实现4位超前进位加法器

    一 1位半加器的实现 1 1 原理 半加器由两个一位输入相加 xff0c 输出一个结果位和进位 xff0c 没有进位输入的加法器电路 1 2 真值表 1 3 逻辑表达式 S 61 A B C 61 A amp B 1 4 Verilog 实
  • C语言实现mavlink库与px4通信仿真

    参照网址 http mavlink io en mavgen c 首先从github上下载对应的C uart interface example 对应的github仓库网址为https github com mavlink c uart i
  • windows下C语言实现TCP通信

    编译器 xff1a vs2017 语言 xff1a c语言 具体的原理可以在其他博客看到 在我学习winsock编程时 xff0c 发现那些博客代码居然在我机器上没一个能运行 xff0c 可能是我水平有限 于是我根据winsock相关知识
  • c 语言udp方式连接代码,C语言实现UDP连接的参考代码

    C语言实现UDP连接的参考代码 xff0c Client连接上Server后将自己所在目录下的 34 liu 34 文件中的前三行文字发送到Server端去 xff0c 然后Server负责接收和显示 server c include in
  • C语言实现HTTP的GET和POST请求

    HTTP请求和IP TCP 所谓的HTTP协议是基于IP TCP协议的 xff0c 所以要获取远端的html数据只要创建socket对象就足够了 xff1b HTTP是基于IP TCP加上了网络请求的固定格式 get 请求 include
  • SHA1校验算法C语言实现

    SHA1 安全哈希算法 xff1a 对于长度小于2 64位的消息 1M 61 1024k 1K 61 1024字节 xff0c 1BYTE 61 8bit 可以想象一下2的63次方位可以表示一个多大的数据文件 xff0c SHA1会产生一个
  • 比较冒泡排序、选择排序和快速排序的时间(C语言实现)

    文章目录 前言代码设计代码实现运行结果结果分析稳定性测试 总结 前言 本文主要比较冒泡排序 快速排序 选择排序的时间 冒泡排序和快速排序的思想可以参考我转载的以下博文 xff1a https blog csdn net gogo0707 a
  • C语言实现TCP通信

    C语言通过socket编程实现TCP通信 服务端客户端通信例子 xff1a socket tcp 通信1 xff0c socket tcp通信2 xff0c udp使用讲解 xff0c socket udp通信例子 TCP IP协议 叫做传

随机推荐

  • vscode快捷键整理

    1 注释 xff08 1 xff09 方式 注释 取消注释 xff1a Ctrl 43 xff08 2 xff09 方式 注释 xff1a Ctrl 43 Shift 43 取消注释 xff1a Ctrl 43 Shift 43 2 代码排
  • Qt之实现移动的方块(蚂蚁线)

    一 简介 移动的小方块或者说是类似移动的蚂蚁线 xff0c 从一篇文章看到的 xff0c 挺有趣的就自己做了一个 xff0c 可以自由添加方块的个数 xff0c 起始位置 xff0c 方块的宽度 xff0c 方块移动速度等待参数 xff0c
  • Docker 突然挂掉 failed to create shim task: OCI runtime create failed: container_linux.go:345: ...

    目录 问题描述 xff1a 参考 解决方案 最佳方案 xff1a 问题描述 xff1a docker Error response from daemon failed to create shim task OCI runtime cre
  • Qt之事件过滤器(eventFilter)详解

    1 2 1 Qt中事件是如何进行传递 1 2 2 Qt中的事件过滤器 xff08 eventFilter xff09 1 2 3 如何自己模拟发送事件消息 一 Qt中事件过滤器详解 我们先看下另外两个相关的方法 xff0c 一个是给对象安装
  • Qt实现微信截图功能(一)

    简述 Qt 之 简单截图功能 xff08 一 xff09 实现鼠标选中区域截图Qt 之 简单截图功能 xff08 二 xff09 实现可移动选中区域Qt 之 简单截图功能 xff08 三 xff09 实现可拖拽选中区域 在之前的文章中有带大
  • Qt之QMenu菜单去除投影效果(阴影)

    一 简述 我们使用Qt中的菜单 xff0c 正常情况下样式是跟随当前系统菜单的样式 xff0c 我们可以使用样式表进行修饰 xff0c 改变原有风格 xff0c 但是window系统上菜单边框四周会附带阴影的效果 xff0c 样式是无法取消
  • Qt 之 设置窗口边框的圆角

    Qt技术学习班开始了 xff0c 更多精彩 好玩的内容等着你 xff0c 赶紧报名吧 群号 xff1a 655815739 Qt在设置窗口边框圆角时有两种方式 xff0c 一种是设置样式 xff0c 另一种是在paintEvent事件中绘制
  • Qt 之 HTTP 请求下载(支持断点续传)

    简述 最近在研究了一下用Qt 的方法来实现http下载 xff0c Qt 中的Http请求主要用到了QNetworkAccessManager QNetworkReply QNetworkRequest 这三块 本篇文章主要叙述如何用Qt
  • Qt之实现录音播放及raw(pcm)转wav格式

    简述 在上一篇 Qt 之 WAV文件解析 中详细地分析了wav格式文件的文件头信息 通过QAudioInput实现录音功能 xff0c 但是录音生成的文件并不能用播放器打开 xff0c 就算更改后缀名也无法识别 xff08 有时候下载的一些
  • C++中 Unicode 与 UTF-8 编码互转

    1 简述 最近在发送网络请求时遇到了中文字符乱码的问题 xff0c 在代码中调试字符正常 xff0c 用抓包工具抓的包中文字符显示正常 xff0c 就是发送到服务器就显示乱码了 xff0c 那就要将客户端和服务器设置统一的编码 xff08
  • Qt 之 自定义按钮 在鼠标 悬浮、按下、松开后的效果

    Qt技术学习班开始了 xff0c 更多精彩 好玩的内容等着你 xff0c 赶紧报名吧 群号 xff1a 655815739 一 简述 在上一篇 Qt 之 去除窗口部件被选中后的焦点虚线框 中 xff0c 我们为了去除焦点虚线框 xff0c
  • Qt 之 自定义窗口标题栏

    Qt训练营开始了 xff0c 更多精彩 好玩的内容等着你 xff0c 赶紧报名吧 群号 xff1a 861353824 一 简述 今天晚上就如何用Qt自定义窗口标题栏 xff0c 写了一个小例子 xff0c 比较基础 xff0c 实用 在此
  • Qt 之 模仿 QQ登陆界面——旋转窗口篇

    一 简述 今天是新的一年第一篇博客 xff0c 有大半个月没有更新博客了 我想是时候 xff0c 打开电脑 拿起键盘 开始在我的代码之路上披荆斩棘 xff0c 斩杀恶龙 今天就继续来分享QQ登录界面的那些事 QQ登录界面的标题栏有一个小三角
  • Ubuntu配置无线路由器笔记记录

    参考文章 xff1a linux 开启制作无线路由器 ubuntu 1404 linux zhu的博客 CSDN博客 hostapd实现WIFI 热点 xff08 AP xff09 自由枫 的博客 CSDN博客 hostapd 终端get一
  • C++STL的使用心得汇总(vector,string,map,list)

    文章目录 find 函数vector的findstring的findmap的find count 函数vector的countstring的countmap的count vectorstringmap的各种排序方法转换相关 待完善 find
  • Qt 之 样式表的使用——设置样式的方法

    一 简述 我们通常在使用Qt开发的过程中都会使用样式表来美化我们的界面 xff0c 关于如何使用样式表的资料也很多 xff0c 样式表的使用方法也千变万化 为了搭建一个漂亮的界面那么必须学会如何使用样式表 xff0c Qt帮助文档中提供了非
  • 如何使QGraphicsItem不随QGraphicsView放大缩小而改变大小

    一 简述 在使用QGraphicsView过程中 xff0c 有时候我们需要对view进行缩放 xff0c 但是对于一般正常的加入view中的item都会随着view的大小变化而变化 xff0c 但是如果我们想让某些item不随view的缩
  • 【linux系统如何查看内核版本、操作系统版本等信息】

    有时候需要查看linux系统的内核版本 xff0c 可以有多种方法 xff0c 方法如下 xff1a xff08 下面以优麒麟系统为例 xff09 方法1 xff1a 打开mate终端 xff0c 在命令行输入以下命令 xff1a unam
  • 【linux系统如何安装arm交叉编译工具链】

    文章目录 前言一 arm交叉编译器介绍命名规则具体编译器 二 Arm GNU Toolchain安装总结 前言 本文简要介绍arm交叉编译器及工具链的安装方法 一 arm交叉编译器介绍 命名规则 交叉编译工具链的命名规则为 xff1a ar
  • 比较冒泡排序、选择排序和快速排序的时间(C语言实现)

    文章目录 前言代码设计代码实现运行结果结果分析稳定性测试 总结 前言 本文主要比较冒泡排序 快速排序 选择排序的时间 冒泡排序和快速排序的思想可以参考我转载的以下博文 xff1a https blog csdn net gogo0707 a