【八大排序(十)】八大排序效率与稳定性分析

news2024/11/23 20:55:52

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:八大排序专栏⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习排序知识
  🔝🔝


在这里插入图片描述

八大排序总结

  • 1. 前言
  • 2. 什么是排序算法的稳定性?
  • 3. 各大排序稳定性分析
    • 3.1 插入和希尔排序的分析
    • 3.2 选择,堆排序的分析
    • 3.3 冒泡,快速排序的分析
    • 3.4 归并排序分析
  • 4. 各大算法效率比较
  • 5. 总结与代码分享


1. 前言

比较八大排序不能直接将
这八个排序放在一起讨论
我们根据大致效率将它们分为两组:
(每个排序的详情链接在后面)

1. 第一组

  • 插入排序 详情
  • 选择排序 详情
  • 冒泡排序 (略)

2. 第二组

  • 堆排序 详情
  • 希尔排序 详情
  • 快速排序 详情
  • 归并排序 详情

在这里插入图片描述

各大排序的进阶版本被放在了专栏:
    八大排序专栏

本篇文章将从稳定性和效率两个方面
来分析这两组排序


2. 什么是排序算法的稳定性?

官方话语是这样的:

排序序列中,有多个具有相同关键字的记录经过排序,记录对应的相对次序保持不变,这就是排序的稳定性。

举个例子,定义一个无序数组:

int a[]={5(i),3,6,4,5(j),2,8};

数组中有两个5
把第一个5记为 i
第二个5记为 j
当我们用任意算法排好序后

int a[]={2,3,4,5,5,6,8};//排好序后的数组

若 i 还在 j 前面,则这个算法是稳定的

int a[]={2,3,4,i,j,6,8};

若 i 在 j 后面,则算法不稳定

int a[]={2,3,4,j,i,6,8};

3. 各大排序稳定性分析

想要搞清楚排序是否稳定
就要明白内部的实现思路!


3.1 插入和希尔排序的分析

1. 插入排序:

插入排序是从数组中第一个元素开始
一一和它后面的元素做比较
并且一个元素向前挪动停下来的条件是:
当前元素的值大于等于正在挪动的元素

结论: 是稳定的

2. 希尔排序:

虽然希尔排序是对插入排序的优化
但是希尔排序多了一个分组预排序
当相同的数组被分到同一组时
它们的顺序不会变化
但是当相同的数据分到不同组时
排好序后的顺序就有可能改变!

结论: 不是稳定的


3.2 选择,堆排序的分析

1. 选择排序:

选择排序明显是不稳定的
当前循环选出的最大值是
这个值第一次出现的位置
将它放在数组最后,第二层循环
寻找次大值时若和刚刚的值相同
这个次打值就到倒数第二个位置了

结论: 不稳定的

2. 堆排序:

堆排序和选择排序类似
我们直接举个向下调整的例子:

在这里插入图片描述

蓝色的5从第一个位置跑到最后一个了

结论: 不稳定的


3.3 冒泡,快速排序的分析

1. 冒泡排序:

冒泡排序是挨个儿比较
挨个儿交换.所以不会将相同的值
交换到不同的位置

结论: 稳定的

2. 快速排序

快速排序比较特殊.
当基准值key和L,R指针相遇的点
对应的值相同时,会改变位置!
画图说明:

在这里插入图片描述

5的前后顺序发生了变化

结论: 不稳定的


3.4 归并排序分析

归并排序可以稳定也可以不稳定
当左右子数组中出现相同值时
如果先将左子数组的数据入数组
那么归并排序就是稳定的
如果先将右子数组的数据入数组
那么归并排序就是不稳定的

所以我们写归并排序时
数据相同时尽量先下左边

结论: 稳定的!


4. 各大算法效率比较

现实生活中处理的信息量往往非常大
这里我们随机生成五百万个数排序
试一试每一个排序算法要花多少毫秒?

注:clock是记录程序
走到当前这一行运行的时长
两个clock相减就是中间程序运行的时间

//测试性能
void TestOP()
{
	srand(time(0));
	const int N = 5000000;
	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];
	}

	int begin1 = clock();
	InsertSort(a2, 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(a2, N);
	int end4 = clock();

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

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

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

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

对于五百万个数据来说
插入,选择,冒泡排序运行的时间会很长
所以我们这里直接比较第二组排序
:

五百万个数据:

在这里插入图片描述

一百万个数据:
在这里插入图片描述

每个排序效率都不错
快排与归并格外的好!


5. 总结与代码分享

八大排序整体完结!
下面分享一个知识表格大全:

排序方法最好情况最坏情况辅助空间稳定性
冒泡排序O(N)O(N2)O(1)稳定
选择排序O(N2O(N2O(1)不稳定
插入排序O(N)O(N2O(1)稳定
希尔排序O(N1.3)O(N2)O(1)不稳定
堆排序O(N*log2N)O(N*log2N)O(N)不稳定
快速排序O(N*log2N)O(N2)O(log2N~N)不稳定
归并排序O(N*log2N)O(N*log2N)O(N)稳定

我将C语言实现八大排序
所有代码汇总分享给大家:

gitee代码仓库

八大排序所有内容结束!
在这里插入图片描述

🔎 下期预告:C嘎嘎初阶 🔍

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

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

相关文章

基于多模态变分对抗主动学习的下游医学图像分析任务

文章目录 M-VAAL: Multimodal Variational Adversarial Active Learning for Downstream Medical Image Analysis Tasks摘要本文方法实验结果 M-VAAL: Multimodal Variational Adversarial Active Learning for Downstream Medical Image Analysis Tasks 摘要 在医学领域&…

chatgpt赋能python:Python自动执行某个软件

Python自动执行某个软件 Python是一种简单易用且非常流行的编程语言&#xff0c;常用于自动化和数据分析。如果你想自动执行某个软件&#xff0c;那么Python将是一个非常好的选择。在本文中&#xff0c;我们将介绍如何使用Python自动执行某个软件&#xff0c;以及如何做好SEO优…

第 351 场LeetCode周赛

A 美丽下标对的数目 模拟 class Solution { public:int countBeautifulPairs(vector<int> &nums) {int n nums.size();int res 0;for (int i 0; i < n; i)for (int j i 1; j < n; j)if (gcd(to_string(nums[i])[0] - 0, to_string(nums[j]).back() - 0) …

人工智能技术与GIS结合的发展

个人本是GIS专业出身&#xff0c;不知名985高校本硕。工作几年后先后积累了国土空间规划、cesium开发、地理信息数据采集、地理大数据处理&#xff0c;遥感影像处理、人工智能识别&#xff0c;做过十多个500万以上的相关项目&#xff0c;有一些浅薄的经验&#xff0c;想和大家分…

tinykv project4总结

主要目标 实现mvcc和2pc, Percolator partA 将存储分为三个独立的部分&#xff0c;lock&#xff08;管理锁记录&#xff09; default(存储数据)&#xff0c;write(提交的记录)&#xff0c;提高并行性 对于lock存储&#xff0c;只要存储一份&#xff08;因为一个行同时只能有…

chatgpt赋能python:用Python编写聊天机器人:打造AI智能助手

用Python编写聊天机器人&#xff1a;打造AI智能助手 简介 聊天机器人在现代生活中越来越受欢迎。一个好的聊天机器人能够回答我们的问题、执行任务、提供娱乐&#xff0c;甚至成为我们的朋友。Python是一种强大的编程语言&#xff0c;其模块化和易学的特性使其成为开发聊天机…

GPT-4在药物发现中的作用|景联文科技

GPT-4是一种生成式AI模型&#xff0c;可以响应文本和图像&#xff0c;它代表了生成式AI可能实现的重大进步。 药物发现的最早任务之一是检索和观察与靶蛋白结合的已知分子。这可能会导致一种基于知识的筛选方法&#xff0c;人们试图通过仅检查这些分子来进行筛选。我们让GPT-4…

【MySQL数据库的表连接语句】

目录 一、连接查询1、inner join(内连接)2、left join(左连接)3、right join(右连接) 二、CREATE VIEW三、UNION取非交集的值 五、CASE六、空值(NULL) 和 无值() 的区别 一、连接查询 A表 B表 UPDATE store_info SET store_nameWashington WHERE sales300;#修改一下表里面的…

chatgpt赋能Python-python自动化办公真的有用吗_知乎

简介 如今&#xff0c;Python作为一种必学的编程语言&#xff0c;已经走进了各行各业的办公场景。Python自动化办公也逐渐成为了一个热门话题&#xff0c;很多人开始使用Python来进行一些机械化、重复性的办公工作&#xff0c;例如数据清洗、文本处理、文件管理、自动发送邮件…

专业CPU信息检测工具:CPU-Z

今天小编为大家测试了一款轻量级的CPU处理器的测试工具&#xff0c;可以查看CPU的详细信息&#xff0c;以供各位同学们学习。 一、简单介绍 CPU-Z是一款非常流行的CPU检测软件&#xff0c;被广大用户所熟知。它是目前最受欢迎的CPU检测软件之一&#xff0c;除了Intel和AMD自带…

chatgpt赋能python:Python自动化填表:省时省力的数据录入方式

Python自动化填表&#xff1a;省时省力的数据录入方式 现代社会&#xff0c;数据填写是我们日常工作中不可避免的一项任务。但手动填写数据不仅费时费力&#xff0c;还容易出错。那么有没有一种方法可以既省时又省力呢&#xff1f;答案是有的&#xff0c;那就是Python自动化填…

Swagger与knife4j接口文档组件详解

swagger介绍 相信无论是前端还是后端开发&#xff0c;都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力&#xff0c;经常来不及更新。其实无论是前端调用后端&#xff0c;还是后端调用后端&#xff…

【数据挖掘】——常见算法对比和选择

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机科学与技术研究生在读 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01; &#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4…

2022(一等奖)D678基于改进结构函数法的大气气溶胶遥感反演

作品介绍 1 应用背景 大气气溶胶是大气中重要的成分之一&#xff0c;是悬浮于大气中的固体和液体微粒与它们的气体载体共同组成的多相体系&#xff0c;其尺度大约在10-3到102 μm之间。大气气溶胶的特性对空气质量具有良好的指示作用&#xff0c;气溶胶的研究对空气质量的监测…

读发布!设计与部署稳定的分布式系统(2版)笔记12_超时模式

1. “模式采用量”绝不是好的质量指标 1.1. 应该形成一种“面向恢复”的思维模式 1.2. 良好的模式能为开发工程师提供架构和设计方面的指导&#xff0c;从而减少、消除或缓解系统中的裂纹产生的影响 1.2.1. 在新发布软件后&#xff0c;它们能让你睡个安稳觉 2. 超时 2.1. …

车载网络测试 - CANCANFD - 基础篇_04

9、CAN报文包含帧格式 1&#xff09;数据帧 2&#xff09;远程帧 3&#xff09;错误帧 4&#xff09;过载帧 SOF&#xff1a;Start Of Frame&#xff0c;帧起始位&#xff1b;一个显性位&#xff0c;表明一帧的开始 RTR&#xff1a;Remote Transmission Request&#xff0c;远…

数字孪生世界建设核心能力:数字孪生高效建模能力

创建高保真的数字孪生体虚拟模型是构建数字孪生应用的重要步骤之一&#xff0c;需要真实的再现物理实体的几何图形、属性、行为和规则等。数字孪生体模型不仅要在几何结构上与物理实体保持一致&#xff0c;更重要的是要能模拟物理实体的时空状态、行为、功能等。 1、三维数字孪…

python爬虫之Scrapy框架--日志信息--数据提取

目录 Scrapy日志信息 了解日志信息 关于日志信息的重要性 利用日志信息进行调试和优化 Scrapy数据的提取 选择器&#xff08;Selector&#xff09;的基本使用 Item的定义与使用 数据处理与管道&#xff08;Pipeline&#xff09; Scrapy日志信息 在开发和调试过程中&a…

chatgpt赋能python:Python能跨平台吗?一文详解

Python 能跨平台吗&#xff1f;一文详解 Python 是一种高级编程语言&#xff0c;自问世以来就一直备受欢迎。其简洁明了的语法&#xff0c;高效率的开发和优秀的文档支持为 Python 赢得了数量众多的粉丝。与其他编程语言相比&#xff0c;Python 最大的优势之一是其可在多个操作…

基于Java应急资源管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…