热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法与数据结构深入解析:冒泡、插入、选择及希尔排序的性能对比分析

本文深入解析了计算机科学领域中常用的几种排序算法,包括冒泡排序、插入排序、选择排序和希尔排序。通过对这些算法的性能进行详细对比分析,探讨了它们在不同数据规模和分布情况下的优劣。研究结果表明,冒泡排序虽然实现简单,但在大多数情况下效率较低;插入排序在部分有序的数据集中表现较好;选择排序的时间复杂度较为稳定,但空间复杂度较高;而希尔排序通过引入增量序列显著提高了排序效率,适用于大规模数据集。

冒泡排序

冒泡排序(Bubble Sort),是一种 计算机科学领域的较简单的 排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。

算法原理:

冒泡排序算法的运作如下:(从后往前)

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

时间复杂度:

若文件的初始状态是正序的,一趟扫描即可完成排序。
所需的关键字比较次数C和记录移动次数M均达到最小值。
Cmin = n-1; Mmin = 0;
所以,冒泡排序最好的 时间复杂度为O(n)
若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

冒泡排序的最坏时间复杂度为

最坏情况

综上,因此冒泡排序总的平均时间复杂度为O(n^2)

#include
#include
#include "SortTestHelper.h"
#include "SelectionSort.h"
#include "InsertionSort.h"using namespace std;template
void bubbleSort( T arr[] , int n){bool swapped;//是否交换过do{swapped = false;//将交换过置为flasefor( int i = 1 ; i arr[i] ){swap( arr[i-1] , arr[i] );//往后浮了之后,置标志位为true。swapped = true;//true进入下一次循环。}// 优化, 每一趟Bubble Sort都将最大的元素放在了最后的位置// 所以下一次排序, 最后的元素可以不再考虑n --;}while(swapped);//
}int main() {int n &#61; 10000;// Test for Random Arraycout<<"Test for Random Array, size &#61; "<}

运行结果&#xff1a;

三种排序运行时间对比

可以看出在面对随机乱序的数组时&#xff0c;时间&#xff1a;冒泡排序>选择排序>插入排序
在面对几乎有序的数组时&#xff1a;冒泡>选择>插入

优化过的插入排序还是很棒的。

希尔排序&#xff1a;

#include
#include "SortTestHelper.h"
#include "SelectionSort.h"
#include "InsertionSort.h"
#include "BubbleSort.h"using namespace std;template
void shellSort(T arr[], int n){int h &#61; 1;while( h &#61; 1 ){// h-sort the arrayfor( int i &#61; h ; i &#61; h && e }int main() {int n &#61; 10000;// Test for Random Arraycout<<"Test for Random Array, size &#61; "<}

运行结果&#xff1a;

希尔排序运行结果

可以得出结论希尔排序属于基础排序算法里效果相当好的一个了。




推荐阅读
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 社交网络中的级联行为 ... [详细]
  • 本文介绍了SVD(奇异值分解)和QR分解的基本原理及其在Python中的实现方法。通过具体代码示例,展示了如何使用这两种矩阵分解技术处理图像数据和计算特征值。 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 本文详细探讨了 org.apache.hadoop.ha.HAServiceTarget 类中的 checkFencingConfigured 方法,包括其功能、应用场景及代码示例。通过实际代码片段,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 二维几何变换矩阵解析
    本文详细介绍了二维平面上的三种常见几何变换:平移、缩放和旋转。通过引入齐次坐标系,使得这些变换可以通过统一的矩阵乘法实现,从而简化了计算过程。文中不仅提供了理论推导,还附有Python代码示例,帮助读者更好地理解这些概念。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 本文详细介绍了如何在PHP中删除数组中的指定元素、第一个元素和最后一个元素,并提供了具体的代码示例和相关函数的使用说明。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
author-avatar
诡道89_431
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有