八大排序时间复杂度与稳定性_八种基本排序及其时间复杂度-程序员宅基地

技术标签: 数据结构  

目录

一、冒泡排序

时间复杂度:

稳定性

二、快速排序

时间复杂度:

稳定性

三、直接插入排序 

时间复杂度:

稳定性

四、希尔排序

时间复杂度:

稳定性

五、选择排序 

时间复杂度:

稳定性 

六、堆排序

时间复杂度:

稳定性

七、归并排序

时间复杂度:

稳定性

八、计数排序 

时间复杂度:

​编辑稳定性

斗蛐蛐代码


一图览:

         


一、冒泡排序

时间复杂度:

最好:O(n),当数组有序时,遍历一遍就是完成排序(只有优化情况下才有最好)

最坏:O(n^2)

平均时间复杂度:O(n^2)

        

空间复杂度:

O(1)

一共要走n-1趟:

每一趟能排好一个数据,一共n个数据,如果前n-1个都排好了,那么最后一个就不用排了

每一趟要比较 n -i -1次:

对于n个数据,前后按顺序比较一共要比较n-1次。因为每排好一个数据,每一趟就可以少比较一次,因为前面的数据肯定比排好的数据大/小。

void BubbleSort(int* a, int n)
{
	for (int i = 0; i < n-1; i++)//一共走n-1趟
	{
		int flag = 0;//优化代码而设置的变量
		for (int j = 0; j < n - i-1; j++)//每趟比较n-i-1次
		{
			if (a[j] > a[j + 1])
			{
				swap(&a[j], &a[j + 1]);
				flag = 1;//若发生了交换,则flag置1
			}
		}
		if (flag == 0)//若flag==0,代表这一趟没有任何数据发生交换,说明前后数据严格遵守升/降序,所以数组有序
			break;
	}
}

稳定性

稳定

虽然我慢,但是我很稳定啊!!

由于每次比较都是两个数之间的比较,满足条件就交换,不满足就什么也不做。所以他和其他数据的相对位置不会发生任何改变

         


二、快速排序

时间复杂度:

最好:O(n*log n)

最坏:O(n^2)(一般情况下很少出现,所以我们不用最坏情况为其时间复杂度)

平均时间复杂度:O(n*log n)

        

空间复杂度:

O(log n)

任何快排的实现方法的时间复杂度都相同

一共走 log n 趟:

用二分法,类比二叉树。每次确定好一个数据的位置,然后把这个数据分为左右两部分,大多分 log n 次就可以把数组分到不能再分。

每一趟走 n 次:

因为每一趟排好一个数据后,会把这个数组一分为二,而被分成的这两个数组总元素少1(可忽略,因为到最后这个总元素不会相差原始元素个数太多,若差10则说明有1024个数据)。所以可以把每一趟要走的次数认为是 n 次

最坏情况

数组有序,则要走 n 趟,每趟走 n-i-1 次。也就是 n-1 + n-2 + n-3 ..... + 1 

最后得出的数量级就是 n^2

稳定性

不稳定

虽然我很快,但代价就是不稳重

        


三、直接插入排序 

时间复杂度:

最好:O(n),数组有序,遍历每个数据都不用往前找,直接插入

最坏:O(n^2),数组全逆序,每个数据都要向前挨个找,找到第一个再插入

平均时间复杂度:O(n^2)

        

空间复杂度:

O(1)

 

一共走 n 趟:(n-1也可以,看看要不要把第一位也放进去)

要把每个数据都进行一次插入操作,所以要走 n 趟

每一趟最多走 n-i-1 次:

每一趟的这一个待插入数据,都要向前挨个找,找到满足的为止,最多走 n-i-1 次,最少直接插入

稳定性

稳定(一般来说是稳定的)

看具体实现,如果代码是两数相等的时候不再往前找,那么就是稳定的

        


四、希尔排序

时间复杂度:

最好:O(n*log^2 n)

最坏:O(n*log^2 n)

平均时间复杂度:O(n*log n)

        

空间复杂度:

O(1)

 希尔的时间复杂度十分难计算,这里给个大概的计算方式,用的时候默认记住O(n*log n)就行

一共走约 log3 n 趟:

如果gap每次÷3的话,那么一共会除约 log3 n 次

每一趟比较 gap*∑[(n/gap)-1] 次:

每一种颜色有约 (n/gap) 个(有个数差别是因为可能有些颜色最后会比别的颜色少/多1个)。每种颜色会进行 ∑[(n/gap)-1] 次比较(这里的比较实际上是类似于直接插入,只不过选数据的时候间隔不是1,而是gap)。一共有gap种颜色,所以是 gap*∑[(n/gap)-1] 次。

        

经过专业人士的计算,时间复杂度是O(n*log n)。

反正用的时候会发现,希尔是真

稳定性

不稳定

稳定不了一点,那么快还那么稳定,那不要上天

如图:顺序全乱了

        


五、选择排序 

时间复杂度:

最好:O(n^2)

最坏:O(n^2)

平均时间复杂度:O(n^2)

即使对其优化成:一趟同时找最大和最小放到两端,也改变不了他的数量级,时间复杂度还是O(n^2)

        

空间复杂度:

O(1)

这个时间复杂度度十分稳定,最好最坏都是 n^2

一共走 n-1 趟:

一共有 n 个元素,前 n-1 个排好了,最后一个也就排好了

每一趟走 n-i 次:

因为每一趟都排好了1个数,每次遍历的时候都可以少遍历1个数,所以每一趟走 n-i 次

稳定性 

稳定

这么慢,一定很稳定吧!大错特错!!!!

就排了一趟,就乱掉了,稳不了一点

        


六、堆排序

时间复杂度:

最好:O(n*log n)

最坏:O(n*log n)

平均时间复杂度:O(n*log n)

        

空间复杂度:

O(1)

对排序分为建堆和排序两部分,具体细节详见堆博客 

        

稳定性

不稳定

其本身就是逻辑上的排序,在物理结构上联系不紧


七、归并排序

时间复杂度:

最好:O(n*log n)

最坏:O(n*log n)

平均时间复杂度:O(n*log n)

        

空间复杂度:

O(n)

一共走 log n 趟:

n个数据,总共分成了 log n 层,每次都要对上一层的数据全部处理完,才能形成了新的下一层的新数据,再来进行下次的处理

每一趟走 n 次:

因为每一趟都要进行排序,都要遍历完全部n个数据,所以每趟要走 n 次

稳定性

稳定

只要比较顺序都是统一的从左向右,或者从右向左,就是稳定的

        


八、计数排序 

时间复杂度:

最好:O(n+k)

最坏:O(n+k)

平均时间复杂度:O(n+k)

        

空间复杂度:

O(k)

k是啥?

k是为了排序额外开辟的数组,其数组大小等于原数据的max-min

稳定性

不稳定

计数排序:啊?啥叫稳定?    快是真的快,空间是真浪费,不稳定是真不稳定

因为他 “排序” 的时候已经把顺序全部打乱了

        


斗蛐蛐代码

电子斗蛐蛐,想玩的可以看看

仓库

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_75062065/article/details/133579950

智能推荐

POJ 3311 Hie with the Pie(Floyd+状态压缩DP)-程序员宅基地

文章浏览阅读378次。C - Hie with the PieTime Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64uSubmit StatusDescriptionThe Pizazz Pizzeria prides itself in delivering pizzas to_hie with the pie

BroadCastReceiver的工作过程_解释一下 broadcast 和 intent 在 app 内传递消息的工作流程-程序员宅基地

文章浏览阅读389次。广播的注册过程 API版本 26 参考资料:Android开发艺术探索总体流程预览 在Activity中调用registerReceiver方法,最终调用的是ContextWrapper中的registerReceiver方法。 1 ContextWrapper registerReceiver@Override public Intent registerReceiver(_解释一下 broadcast 和 intent 在 app 内传递消息的工作流程

「无线安全」WIFI安全-1之浅谈Wi-Fi-程序员宅基地

文章浏览阅读1.8k次,点赞53次,收藏16次。WiFi 全称 `Wireless Fidelity`,又称为`802.11b`标准。`Wireless Fidelity`翻译过来是`无线保真`,其中保真是指要求在无线网络中可靠地传输数据。Wi-Fi是一种无线网络技术,可以用于无线互联网接入和数据传输。它是一项非常重要的技术,为我们提供了无线上网和连接设备的便利,通俗的讲就是一种把有线上网的方式转变成无线上网方式的技术。

小米官网轮播图js+css3+html实现-程序员宅基地

文章浏览阅读1.1k次。官网轮播:我的轮播:重难点:  1、布局  2、图片和右下角小圆点的同步问题  3、setInterval定时器的使用  4、淡入淡出动画效果  5、左右箭头点击时,图片和小圆点的效果同步  6、另一种轮播思维解答:  1、最底下容器使用相对定位,图片、小圆点、箭头均使用绝对定位悬浮在底部容器上,图片均的top和left值均设置..._使用html和css3开发制作小米商城网页,并利用javascript制作轮播图,从而完成

pycharm 光标突然变粗,无法正常书写_mac pychorm 工具游标莫名其妙-程序员宅基地

文章浏览阅读4.8k次,点赞4次,收藏3次。使用pycharm有时候不知道按到什么按键,中光标变粗,无法正常打代码,如下:此时pycharm变成了改写模式,只需要按下键盘的ins小按键(即insert键)即可切换成正常模式,问题就解决了...._mac pychorm 工具游标莫名其妙

postgis 坐标体系及文本转geometry格式转换_postgis将txt转换为geometry格式-程序员宅基地

文章浏览阅读412次。2、文本格式输入,通过在地理化文本中增加参数定义地理格式。from 重点场景边框2023 LIMIT 3。1、地理化字段直接转换。_postgis将txt转换为geometry格式

随便推点

JS仿qq下拉菜单_如何实现一个qq列表类似的js逻辑操作?-程序员宅基地

文章浏览阅读108次。功能:1、点击我的好友会展开下拉出具体的好友2、再次点击,会折叠内容3、首次点击某个具体的好友,只有当前这个好友高亮4、再次点击这个好友时,高亮状态就会消失主要练习:js绑定事件慢慢修改小细节:再次点击,会折叠内容时,里面的高亮要全部取消<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="._如何实现一个qq列表类似的js逻辑操作?

Allegro Inside ODB++ 安装_odb++ inside-程序员宅基地

文章浏览阅读7.6k次。allegro odb++ 工具下载地址:http://www.valor.com/en.aspx请选择操作系统您要下载的ODB + +内包装和单击相应的链接。http://www.valor.com/en/Products/ODBpp/Cadence%20Allegro_Inside%20Package.aspx下载并安装文件“ odb_inside_install.nt.v800..._odb++ inside

HTML之实现可隐藏式导航栏_html 怎么实现作于分栏并可以隐藏-程序员宅基地

文章浏览阅读1.3w次,点赞8次,收藏23次。HTML之实现可隐藏导航栏预计目标部分代码展示关键代码解释frame框架用法hideOrDisplayNavFrame()函数解释结果展示预计目标论坛系统中左右两列的框架集结构便于浏览者导航,但同时也使得浏览者的工作区域变小。浏览者希望必要的时候可以隐藏框架集中的某个框架,以使得其他相邻的框架占据尽可能打的面积,如下图所示。现在希望在 tool.html 页面中放置一个自定义命令按钮,单机此按..._html 怎么实现作于分栏并可以隐藏

pycharm 修改__author__-程序员宅基地

文章浏览阅读430次。2019独角兽企业重金招聘Python工程师标准>>> ..._ubuntu中pycharm修改code author

关于intouch软件打开项目时出现“另一会话正在编辑此应用。无法编辑此应用程序。”?_intouch另一会话正在编辑此应用程序-程序员宅基地

文章浏览阅读3.2k次。找到项目文件(注意是项目文件)地址,删除文件夹中的appedit.lok文件。_intouch另一会话正在编辑此应用程序

Python 图形化界面基础篇:使用弹出窗口和对话框_python程序运行窗口2023-程序员宅基地

文章浏览阅读3.5k次,点赞5次,收藏19次。在开发图形用户界面( GUI )应用程序时,与用户进行交互的一种常见方式是通过弹出窗口和对话框。这些弹出窗口允许用户输入数据、进行选择、查看信息等。 Python 的 Tkinter 库和一些第三方库提供了创建和管理弹出窗口和对话框的方法。在本篇博客中,我们将深入探讨如何使用这些功能来增强你的 GUI 应用程序。_python程序运行窗口2023