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

本文涉及的产品
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
简介: 【八大排序(十)】八大排序效率与稳定性分析

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


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


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


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

  🔝🔝


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(N2 O(N2 O(1) 不稳定
插入排序 O(N) O(N2 O(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嘎嘎初阶 🔍


相关实践学习
MySQL基础-学生管理系统数据库设计
本场景介绍如何使用DMS工具连接RDS,并使用DMS图形化工具创建数据库表。
相关文章
|
机器学习/深度学习 人工智能 算法
深度探索数据聚合算法:提高文档管理软件整理效率的秘诀
在这个数字时代,文档管理软件成为了我们日常生活和工作中的强力伙伴。然而,随着文档数量的爆炸增长,文档的整理和分类变得越来越令人头疼。幸运的是,有了新一代的数据聚合算法,我们能够轻松摆脱繁琐的整理工作,使文档管理变得轻松愉快。接下来,让我们深入探讨一下数据聚合算法如何提高文档管理软件中的文档整理效率。
210 0
|
1月前
|
数据库 数据库管理 索引
索引在提高查询性能方面的优势体现在哪些方面?
索引在提高查询性能方面具有多方面的显著优势
|
2月前
|
存储 数据库 索引
如何提高索引的效率和实用性
【10月更文挑战第15天】如何提高索引的效率和实用性
|
7月前
|
缓存 监控 数据库
优化数据库查询性能的八大技巧
在今天的互联网时代,数据库是许多应用程序的核心组件之一。优化数据库查询性能是提升应用程序整体性能的关键。本文介绍了八种有效的技巧,帮助开发人员提高数据库查询性能,从而提升应用程序的响应速度和用户体验。
|
7月前
|
算法 程序员
八大排序源码(含优化)
八大排序源码(含优化)
|
算法 搜索推荐 UED
转:说说排列组合算法在文档管理系统中的应用优势
在现代信息时代,随着数据量的不断增长,文档管理系统变得超级重要!就是在这样的背景下,排列组合算法展现出了在文档管理系统中的多种应用优势。这可是对于提高系统的效率和用户体验来说,简直太关键了!
68 0
|
存储 搜索推荐 UED
转:探索归并排序算法在文档管理系统中的优势和运用
在现代社会中,文档管理系统扮演着重要的角色,帮助人们高效、方便地组织、存储和检索各类文档信息。而作为一个高效排序算法,归并排序在文档管理系统中具有许多优势和广泛的运用。归并排序算法以其稳定性、高效性和扩展性闻名于世,成为文档管理系统不可或缺的一部分。本文将深入探索归并排序算法在文档管理系统中的优势和运用。
60 0
|
算法 搜索推荐 C++
理解实现八大排序(一)
理解实现八大排序
83 0
|
存储 搜索推荐 算法
理解实现八大排序(二)
理解实现八大排序
60 0
|
搜索推荐
各大“排序”特性及稳定性总结
各大“排序”特性及稳定性总结
130 0