八大排序性能大揭秘:谁才是你心中的TOP1?

简介: 八大排序性能大揭秘:谁才是你心中的TOP1?

一、排序算法有那些

1.1 测试排序竞选

上述就是我们全部的常见算法了,但是由于有些算法时间复杂度实在太高了排序上千万个数据的话实在是太慢了可能半个小时都排不完

所以咱们只选择那些大人那桌的数据来进行性能测试,至于冒泡选择这些排序还是让他们去小孩那桌去喝哇哈哈吧!

1.1 最终参选选手:

  • 希尔排序
  • 堆排序
  • 快速排序
  • 归并排序
  • 计数排序

二、测试方案

2.1 随机数测试

本次我们采用 rand( ) 来自动生成随机数来进行生成数据进行排序但是 rand () 函数最多只能生成 3万个随机数我也我们进行+i 来增加数据的随机性

本次测试使用1000万个数据来对比

🍸 代码演示:

// 测试排序的性能对比
void TestOP()
{
  srand(time(0));
  const int N = 10000000;
  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()+i;
    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();
  CountSort(a7, N);
  int end7 = clock();
  //printf("InsertSort:%d\n", end1 - begin1);
  printf("ShellSort:%d\n", end2 - begin2);
  //printf("SelectSort:%d\n", end3 - begin3);
  printf("HeapSort:%d\n", end4 - begin4);
  printf("QuickSort:%d\n", end5 - begin5);
  printf("MergeSort:%d\n", end6 - begin6);
  printf("CountSort:%d\n", end7 - begin7);
  free(a1);
  free(a2);
  free(a3);
  free(a4);
  free(a5);
  free(a6);
}

📑 代码结果:

从这里就可以看到在排整数数据的排序来看计数排序是非常占优势的,直接拿下TOP1的排序性能排名我们的老大哥快排紧随其后

总体而言在当前1000万个较为不重复数据中:

计数排序 > 快速排序 > 希尔排序 > 堆排序 > 归并排序

🔥 注:当然这代表的并不绝对,希尔排序不一定比堆排差因为1000万个数据 而rand就算+i 避免了一些重复数据,但还是有很多。

2.2 重复值较为多的随机数测试

本次测试使用1000万个数据来对比,并不进行加工去重

诶这里来看计数依旧遥遥领先, 继续做稳老大哥的位置而归并在重复值较多的情况下跑到了第二

总体而言在当前1000万个重复数据较多的排序中:

计数排序 > 归并排序 > 快速排序 > 希尔排序 > 堆排序

三、排序稳定性对比

说到稳定性对比很多铁汁可能以为是 排序性能在各种场景的波动的性能稳定性大不不大但其实排序的稳定性其实不是这样算下面就来看看排序的稳定性到底是怎么算的吧

3.1 什么是排序稳定性

排序的稳定性是指在排完序后相同数据的顺序不变这才能确定一个排序是否稳定。

假设你是对考试比赛成绩来进行排序,但是同一分数内考生提交的时间不一样这就需要我们使用排序稳定的算法来进行排序了

  • 如果使用不稳定的排序那么考试顺不就全乱了这是绝对不能犯的错误

3.2 排序的稳定的有那些

冒泡排序

冒泡排序的思想是俩俩比较然后才进行交换但是如果数据一样的话肯定就不会进行交换这样相同数据的先后顺序就不会发生改变了

直接插入排序

直接插入排序也是当新数据来的时候如果和前一个数据一模一样的话那么就直接在其后面进行插入所以也不会打乱相同数据的先后顺序

归并排序

归并排序我们可以将其相同数据比较的时候优先归并前一个数据这样也不会打乱相同数据的先后顺序。

  • 这样可以改变稳定性的排序都是稳定的

3.3 那些排序为什么不稳定

希尔排序

由于希尔排序是分租来进行排序的所以相同数据可能分成很多不同的组会打乱其 相同数据的排序顺序所以是不稳定的

预排序的时候会分到不同的组所以不稳定

堆排序

堆排序是每次和子节点进行比较交换而当左右节点的数据一样的时候并不能确保先向下调整哪一个所以其稳定性也是不稳定的

快速排序

快速排序每次都会把前一个数据交换到中间或者其他地方所以他的性能也是不稳定的

计数排序

计数排序只能排序整形,而显示生活中对一些事务的排序往往需要排多种数据结构所以不能对其比较稳定性

四、排序性能总结表

目录
相关文章
|
C#
WPF 界面实现多语言支持 中英文切换 动态加载资源字典
原文:WPF 界面实现多语言支持 中英文切换 动态加载资源字典 1、使用资源字典,首先新建两个字典文件en-us.xaml、zh-cn.xaml。定义中英文的字符串在这里面【注意:添加xmlns:s="clr-namespace:System;assembly=mscorlib】 zh-cn.
3506 0
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
601 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
编码器-解码器架构详解:Transformer如何在PyTorch中工作
本文深入解析Transformer架构,结合论文与PyTorch源码,详解编码器、解码器、位置编码及多头注意力机制的设计原理与实现细节,助你掌握大模型核心基础。建议点赞收藏,干货满满。
835 3
|
编解码 Java 测试技术
『App自动化测试之Appium应用篇』| uiautomator + accessibility_id定位方法完全使用攻略
『App自动化测试之Appium应用篇』| uiautomator + accessibility_id定位方法完全使用攻略
612 0
|
存储 算法 Linux
深入理解Linux虚拟内存管理(二)(下)
深入理解Linux虚拟内存管理(二)
381 0
|
算法 Java 开发者
《黑神话:悟空》Xbox版的技术挑战与解决方案
【8月更文第26天】《黑神话:悟空》是一款备受期待的动作角色扮演游戏,以其精美的画面和丰富的中国神话故事背景而闻名。本篇文章将重点介绍游戏在Xbox平台上的技术挑战及其解决方案,特别是针对内存管理的问题。通过深入分析,我们将了解开发团队是如何克服这些挑战,确保游戏在Xbox上能够流畅运行的。
474 4
|
Java API 时序数据库
springboot如何配置influxdb
【6月更文挑战第24天】springboot如何配置influxdb
931 0
|
SQL 关系型数据库 数据处理
实时计算 Flink版产品使用合集之debezium-json消息消费能否直接开多并行度
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
机器学习/深度学习 自动驾驶 搜索推荐
大模型技术的端侧部署
【1月更文挑战第14天】大模型技术的端侧部署
941 4
大模型技术的端侧部署
|
算法 网络虚拟化 C语言
【Cisco Packet Tracer】交换机划分Vlan实验
文章目录 一、前期准备 二、实验要求 三、搭建局域网 四、配置pc端的ip 五、配置VLAN 六、设置端口模式trunk 七、PING检验是否通路