八大排序总结篇

news2025/2/28 5:10:25

一、前言

        到这里,数据结构的八大排序就算是全部写完了。这一期总结篇我们来测试一下八大排序的效率,印证一下八大排序的时间复杂度,以及深度剖析一下八大排序的稳定性问题。


二、八大排序

1、直接插入排序

http://t.csdn.cn/CdFFu

2、希尔排序

http://t.csdn.cn/LB4Dz

3、堆排序

http://t.csdn.cn/AsfgY

4、快速排序(霍尔发、挖坑法、前后指针法、非递归方法)

http://t.csdn.cn/Q45ZL

5、直接选择排序

http://t.csdn.cn/G1beq

6、冒泡排序

http://t.csdn.cn/hKoYT

7、归并排序

http://t.csdn.cn/twdWg

8、计数排序

http://t.csdn.cn/pM4mh

  


三、稳定性问题

稳定性

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

1、直接插入排序  ——稳定

一般都是把小的数字插入到对应的位置,并不会影响其他有序数字的相对位置。

如图,我们只是会把 3 插入到序列中,而前面的 1 2 3 4 5 6的相对位置是没有变化的,所以直接插入排序是稳定的。

2、希尔排序  ——不稳定

其实这个很好理解,希尔排序一开始的间隔很大的时候得到的是大致有序的序列,而后间隔逐渐变小,排在前面的一些较大的数字还是可能会被换到后面去,这样就破坏的原先的有序的序列。

 

我们可以看到,原本的5排完第一轮之后结果还走到1的前面去了。 

显而易见,希尔排序是不稳定的排序。

3、堆排序  ——不稳定

堆排序不管是向上调整还是向下调整,都是只注重父节点与子节点的大小关系,而兄弟节点之间大小关系很容易随着父节点和子节点的交换被打破。

4、快速排序  ——不稳定

快速排序因为是每次找到大于key和小于key的值来交换,还是有可能把较大的数放到了前面

 这样的情况也是有可能的,最后还是需要调整5和4的位置,但是这样就打破了4 7 8 9之间的相对位置。

所以快速排序是不稳定的。

5、直接选择排序  ——不稳定

因为是直接在整个数组中找出最大和最小,通过交换之后放在数组头部和尾部,看着好像稳定,但是某些特定情况下还是会出现不稳定。

我们找到第一个8和第一个5的时候是要交换的,但是交换之后的8到了第二个8的右边,就打破了稳定性。 

6、冒泡排序  ——稳定

冒泡排序虽然效率不高,但是稳定性还是可以的。因为冒泡排序是把大的数字逐渐往右移动,所以不存在打破稳定性一说,一定是从无序变成有序的,而且不会改变之前的元素相对位置。

7、归并排序  ——稳定

归并排序分到最细的时候排完之后有序元素的相对位置就不会再变了,因为剩下的归并然后排序都是从有序的数组中抽取数字进行有序排序,所以一定不会改变原来的相对位置。

详情参考下图:

 

计数排序不存在排序过程,这里就不探讨其稳定性问题了。


四、效率测试

在10000个数字测试下

时间复杂度O(N*logN)和O(N^2) 的差距还不是很大,但是还是能够看出:希尔排序、快排、堆排序、归并排序是很快的,特别是快排,基本没用时间。

 100000个数字测试下

时间复杂度O(N*logN)和O(N^2) 的差距差距就非常明显了 ,快排还是最快的那个。所以,大家明白为什么企业考的最多的就是快排了吧,效率是非常高的。

10000000个数字测试案例博主就不测试了,需要时间过长……

有兴趣的小伙伴可以自己试试,下面附上测试代码:

void TestOP()
{
	srand(time(0));
	const int N = 100000;
	int* a1 = (int*)malloc(sizeof(int) * N);
	int* a2 = (int*)malloc(sizeof(int) * N);
	int* a3 = (int*)malloc(sizeof(int) * N);
	int* a4 = (int*)malloc(sizeof(int) * N);
	int* a5 = (int*)malloc(sizeof(int) * N);
	int* a6 = (int*)malloc(sizeof(int) * N);
	int* a7 = (int*)malloc(sizeof(int) * N);

	for (int i = 0; i < N; ++i)
	{
		a1[i] = rand();
		a2[i] = a1[i];
		a3[i] = a1[i];
		a4[i] = a1[i];
		a5[i] = a1[i];
		a6[i] = a1[i];
		a7[i] = a1[i];
	}

	int begin1 = clock();
	InsertSort(a1, N);
	int end1 = clock();

	int begin2 = clock();
	ShellSort(a2, N);
	int end2 = clock();

	int begin3 = clock();
	SelectSort(a3, N);
	int end3 = clock();

	int begin4 = clock();
	HeapSort(a4, N);
	int end4 = clock();

	int begin5 = clock();
	QuickSort(a5, 0, N - 1);
	int end5 = clock();

	int begin6 = clock();
	MergeSort(a6, N);
	int end6 = clock();

	int begin7 = clock();
	BubbleSort(a7, N);
	int end7 = clock();

	printf("InsertSort:%d\n", end1 - begin1);
	printf("ShellSort:%d\n", end2 - begin2);
	printf("SelectSort:%d\n", end3 - begin3);
	printf("BubbleSort:%d\n", end7 - begin7);
	printf("HeapSort:%d\n", end4 - begin4);
	printf("QuickSort:%d\n", end5 - begin5);
	printf("MergeSort:%d\n", end6 - begin6);

	free(a1);
	free(a2);
	free(a3);
	free(a4);
	free(a5);
	free(a6);
	free(a7);
}

int main()
{
	TestOP();
	return 0;
}

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

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

相关文章

css:为什么我设置宽高百分比不生效

很多新手朋友写 css 的时候&#xff0c;有时发现设置宽高百分比有用&#xff0c;有时候又没用&#xff0c;到底怎么回事呢&#xff1f; 核心原则 设置百分比的时候&#xff0c;需要父元素有固定的高度&#xff0c;注意&#xff0c;这里说的只是需要父元素有固定的高度&#x…

机器学习极简入门笔记-4-有监督学习进阶-HMM

目录 15.1 基本概念 概率模型 生成模型与判别模型 概率图模型 马尔可夫链&#xff0c;马尔可夫随机场和 CRF 15.2 数学中的HMM HMM的两个基本假设 15.3 HMM的三个基本问题 概率计算问题 预测问题 学习问题 15.4 HMM3个基本问题的计算 概率计算问题 预测问题 学习…

【Spring源码】18. 属性填充:populateBean()详解

进入populateBean() 对bean的属性进行填充&#xff0c;将各个属性值注入&#xff08;存在其他bean的属性&#xff0c;则会递归初始化依赖的bean&#xff09; ​一开始会先对传入的参数进行判断&#xff08;如下图红框框中的逻辑&#xff09; 如果传入的BeanWrapper和RootBeanD…

如何免费将pdf转word?看完这篇你就会了

pdf是我们学习工作中&#xff0c;经常会接触到的一种文件格式。通常我们都会以这种pdf格式来传输文件&#xff0c;因为它可以确保在不同的设备上打开以及不会出现文件内容格式错乱的情况。可是当我们需要对它的内容进行修改时&#xff0c;就有些困难&#xff0c;需要先将pdf转换…

软件测试之缺陷书写规范

1、标题&#xff1a;应保持简短、准确、提供缺陷的本质信息。 -尽量以缺陷发生的原因与结果的方式相结合的放式书写; -尽量避免使用模糊不清的词语&#xff0c;例如&#xff1a;“功能中断”、“功能不正确”、“行为不起作用”等&#xff0c;应该使用具体文字说明缺陷的症状; …

flink学习之sql-client之踩坑记录

flink/bin目录下会看到这个脚本&#xff0c;最开始以为是和spark-shell差不多的。结果自行摸索无果&#xff0c;网上查的文章也写的很垃圾&#xff0c;自己查官网看下吧。 SQL 客户端 | Apache Flink 直接./sql-client.sh SELECT Hello World; 报错 org.apache.flink.runtim…

NFT 泡沫是否已经被挤破

Sep. 2022, Dan LeBaron Data Source: Footprint Analytics - NFT Volume in 2021 Vs. 2022 虽然NFT已经存在了几年&#xff0c;但在无聊猿 (BAYC)等大型项目启动的推动下&#xff0c;该技术在2021年爆发式地流行。 似乎是突然间&#xff0c;名人、运动员和主要的艺术收藏家都…

深度剖析 Python 日志重复打印问题

python 日志处理流程 使用 python 做日志输出时&#xff0c;首先我们需要一个创建一个 Logger 对象&#xff1a;import logging; logger logging.getLogger() 然后就可以用 logger.info/debug/error(msg) 来输出日志 如果只是单纯地打印日志&#xff0c;这样做和 print 没有任…

高压功率放大器的作用(功率放大器的应用领域是什么)

高压功率放大器的适用范围和应用领域是很多电子工程师所关心的&#xff0c;那么高压功率放大器的作用以及有哪些使用场景呢&#xff0c;下面就让安泰电子来为大家介绍。 高压功率放大器是电子实验室会频繁使用的测试仪器&#xff0c;是在实验中能够帮助输出信号达到最大输出功率…

【黄啊码】用PHP7性能居然是5.6的三倍?赶紧看看它有什么新特性-续

大家好&#xff0c;我是黄啊码&#xff0c;上节课的东西学完了吧&#xff1f;脑瓜子嗡嗡的吧&#xff1f;来&#xff0c;继续&#xff0c;让脑瓜子一次性嗡个够&#xff0c;压力大&#xff0c;才有动力。 目录 PHP CSPRNG PHP 7 use 语句 PHP 7 错误处理 PHP intdiv() 函…

实验28:步进电机实验

OK,我是走程序猿的道路 我的blog侧重点在讲解代码 本实验结果: 步进电机正转 步进电机反转 步进电机工作原理我就不去讨论了 重点在于代码分析和讲解 01 硬件电路设计 硬件电路总图 接口: 步进电机驱动器板和Arduino Uno板之间的接线: 步进电机驱动器 Arduino Uno…

opencv之 drawContours() 函数说明应用

drawContours 之前使用mask图还进行了连通域有无status分析&#xff0c;然后才进行的绘制。 今天发现直接使用mask图进行绘制&#xff0c;然后通过设置drawContours的参数可以进行不同层次上缺陷的绘制&#xff0c;然后通过这个事情也说明&#xff0c;有问题可以直接找opencv官…

“综合”web项目编写------手把手0基础教学(一)

我们平常看到的项目代码一般都是分段单独的功能&#xff0c;但如何将功能汇总成一个完整的项目呢&#xff0c;下面我将利用IDEA来介绍一个基础的综合web项目 目录 一.创建项目 二.为项目建包 1.了解构建项目的思路 &#xff08;1&#xff09;构建模型&#xff08;模型包括数…

集线器与交换机、虚拟局域网(3.3)

集线器与交换机 传输门&#xff1a;b站湖科大教书匠 集线器 使用集线器的以太网或者局域网其实本质还是一个总线网 工作方式 集线器只工作在物理层&#xff0c;每个接口仅仅用来转发比特&#xff0c;不进行碰撞检测&#xff08;不使用CSMA/CD协议&#xff09;&#xff0c;由…

如何自定义代码生成器(上)

1 概述 1.1 介绍 ​ 在项目开发过程中&#xff0c;有很多业务模块的代码是具有一定规律性的&#xff0c;例如controller控制器、service接口、service实现类、mapper接口、model实体类等等&#xff0c;这部分代码可以使用代码生成器生成&#xff0c;我们就可以将更多的时间放…

深度学习中激活函数的用途

深度学习中激活函数的概念 激活函数&#xff0c;即Activation Function,有时候也称作激励函数。它是为了解决线性不可分的问题引出的。但是也不是说线性可分就不能用激活函数&#xff0c;也是可以的。它的目的是为了使数据更好的展现出我们想要的效果。激活函数是一种非线性的…

SAP UI5 SmartTable 控件本地运行时进行 Excel 导出的单步调试

点击 SmartTable 控件生成的表格控件的 Export to Excel 时&#xff0c;遇到如下错误消息&#xff1a; The following error has occurred during export: Unexpected server response: SmartTable 基于的是 OData V4 的模型了&#xff1a; Excel export 操作&#xff0c;触发的…

接口(上)

&#x1f437;1.接口的概念 &#x1f431;‍&#x1f680;2.接口的语法规则 &#x1f49a;3.接口的使用 &#x1f680;4.接口的特性 &#x1f386;5.实现多个接口 &#x1f436;6.接口间的继承 &#x1f38a;7.接口使用的实例 1.什么是接口呢&#xff1f;&#xff1f;&a…

【https】lighttpd增加https支持及openssl生成CA(Certificate Authority)和使用CA来制作签名证书操作说明

环境说明 ubuntu18.04.1、openssl指令需要支持 openssl生成CA&#xff08;Certificate Authority&#xff09; 生成RSA Private Key openssl genrsa -out ca.key 输出信息 $ openssl genrsa -out ca.key Generating RSA private key, 2048 bit long modulus (2 primes) ...…

Scala008--Scala中的数据结构【集合】

目录 一&#xff0c;概述 二&#xff0c;set的声明 1,不可变set集合 1)向不可变集合中添加元素 【需要新的set集合接收】 2&#xff09;对两个set集合进行合并 【需要新的set集合接收】 2&#xff0c;不可变的HashSet集合 2&#xff0c;可变HashSet集合 1&…