排序(冒泡排序、选择排序、插入排序、希尔排序)-->深度剖析(一)

欢迎来到我的Blog,点击关注哦💕

前言

排序是一种基本的数据处理操作,它涉及将一系列项目重新排列,以便按照指定的标准(通常是数值大小)进行排序。在C语言中,排序算法是用来对元素进行排序的一系列步骤。

排序的概况

C语言中的排序算法是一系列用于将一组数据按照特定顺序进行排列的算法。这些算法通常根据元素之间的大小关系来确定它们在最终排序结果中的位置。

衡量排序的标准

  • 时间复杂度(参考:时间空间复杂度介绍)
  • 辅助空间:有些排序算法在排序过程中需要额外的空间来辅助排序,例如归并排序和快速排序。这些算法的辅助空间通常为O(n),而有些算法如插入排序和冒泡排序的辅助空间为O(1)
  • 稳定性:稳定性是指在排序过程中,相等键值的元素在原始序列中的相对位置是否保持不变。稳定排序算法会维持相等元素的相对次序,而不稳定排序算法则可能改变这些元素的相对次序。
  • 特殊情况下性能:某些排序算法在特定情况下可能表现得更优,例如当数据已经部分有序时,插入排序和冒泡排序可能会更快。而快速排序在这种情况下可能会变慢。

冒泡排序(Bubble Sort)

冒泡排序概念

冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。这个过程会重复进行,直到没有再需要交换的元素,这意味着数列已经排序完成。这个过程就像是气泡一样,较小(或较大)的元素会逐渐“冒泡”到列表的顶端

在这里插入图片描述

代码实现

冒泡排序算法的实现通常涉及两个嵌套的for循环。外层循环控制每一轮的比较次数,内层循环用于比较相邻元素并进行交换。

//冒泡排序
void BubbleSort(int* a, int n)
{for (int i = 0; i < n; i++){for (int j = i; j < n-i-1; j++){if (a[j] > a[j + 1]){Swap(&a[j], &a[j + 1]);}}}
}

优化冒泡排序

当冒泡排序遇见 {2,1,4,5,6,7,8,9,10} 这样的数据就会大大折扣性能。如遇见如此的数据进行排序,我们可以定义一个bool类型flag = false 当数据进行交换的时候我们改变flag;

代码如下:

//冒泡排序
void BubbleSort(int* a, int n)
{for (int i = 0; i < n; i++){bool flag = false;for (int j = i; j < n-i-1; j++){if (a[j] > a[j + 1]){Swap(&a[j], &a[j + 1]);flag = true;}if (flaf == false){break;}}}
}

冒泡排序复杂度分析

冒泡排序算法的时间复杂度为O(n^2), 这是因为在最坏的情况下,即数组完全逆序时,冒泡排序需要进行n-1轮比较和交换,其中n是数组的长度。每一轮比较需要比较n-i次(i为当前轮数),因此总的比较次数为n*(n-1)/2。所以,冒泡排序的时间复杂度为O(n^2)

选择排序(Selection Sort)

选择排序的概念

选择排序(Selection Sort)是一种简单直观的排序算法,它的基本思想是在每一轮中从不排序的子序列中选取最小(或最大)的元素,将其与子序列的起始位置的元素交换,从而逐渐构建起有序序列。

在这里插入图片描述

代码实现

选择排序思想简单,排序大->小(小->大),就遍历数组记录即可。

//交换
void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}//选择排序
void SelectSort(int* a, int n)
{int min = 0;int begin = 0;while (begin < n - 1){for (int i = begin; i < n; i++){if (a[i] < a[min]){min = i;}}Swap(&a[min], &a[begin]);++begin;}
}

优化选择排序

选择排序可以通过一些优化手段进行提升,例如使用哨兵变量来减少内层循环的判断次数等。这些优化手段可以在一定程度上提高选择排序的执行效率。(在这里就不实现了

选择排序的复杂度分析

选择排序的时间复杂度为 O(n^2),其中n是数组的长度。这是因为算法需要进行两层循环,外层循环控制排序的轮数,内层循环则负责在每一轮中找到最小元素。

插入排序(Insertion Sort)

插入排序的概念

插入排序是一种简单直观的排序算法,它的基本思想是将未排序的元素插入到已排序元素形成的有序序列中。在每一轮排序中,都会将一个待排序的元素插入到它应该所在的位置,直到所有元素都被插入完毕。
在这里插入图片描述

代码实现

定义循环进行比较将大(小)的值相后面依次挪动,直至寻找到比自己小(大)的值位置进行插入。

//插入排序
void InsertionSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int end = i;int tmp = a[end + 1];while (end >= 0){if (a[end] > tmp){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}

插入排序的优化

  • 可以进行二分插入,它通过二分查找来确定待插入位置,从而减少了比较和移动的次数。
  • 希尔排序是对直接插入排序的优化,它通过增加一个间隙因子来分组排序,使得每个组内部的元素可以先进行排序,然后逐渐减小间隙因子,直到间隙因子为1,此时整个数组已经接近有序,插入排序的效率会得到提高

插入排序复杂度分析

  • 最佳情况:如果输入数组已经是完全有序的,插入排序只需要进行 n 次比较(每次比较后插入一个元素到已排序部分),而不需要进行任何交换。在这种情况下,时间复杂度是 O(n)
  • 平均情况:在平均情况下,插入排序的时间复杂度是 O(n^2)。这是因为每个元素都需要与已排序部分的多个元素进行比较,平均下来,每个元素需要比较 n/2 次。
  • 最坏情况:如果输入数组是完全逆序的,插入排序需要进行 n(n-1)/2 次比较和 n(n-1)/2 次交换,时间复杂度是 O(n^2)

希尔排序(Shell Sort)

希尔排序的概念

希尔排序(Shell Sort)是一种基于插入排序的算法,它通过引入增量序列,采取分组排序策略:将大数组分为若干个子序列,对每个子序列进行插入排序。随着增量逐渐减小,子序列变得更小,最终达到增量为1,整个数组变成一个有序序列,完成排序。这种排序方式使得希尔排序在初始阶段,使用较大的步长让序列更快时间的接近有序,并且减少了不必要的比较与交换。

代码实现

//希尔排序
void ShellSort(int* a, int n)
{int gap = n;while (gap >= 1){gap /= 2;for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

希尔排序复杂度分析

希尔排序算法的平均时间复杂度通常被认为是介于 O(n log n) 和 O(n^2) 之间,具体取决于所选择的间隔序列。在最佳情况下,当间隔序列满足特定条件时,希尔排序可以达到接近 O(n) 的时间复杂度。然而,在最坏情况下,希尔排序的时间复杂度为 O(n^2)。

break;}}a[end + gap] = tmp;}
}

}


## 希尔排序复杂度分析希尔排序算法的平均时间复杂度通常被认为是介于 O(n log n) 和 O(n^2) 之间,具体取决于所选择的间隔序列。在最佳情况下,当间隔序列满足特定条件时,希尔排序可以达到接近 O(n) 的时间复杂度。然而,在最坏情况下,希尔排序的时间复杂度为 O(n^2)。

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

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

相关文章

FPGA 690T NVME高速存储设计

高速存储设计会有各种需求的考虑&#xff0c;那么对应的方案也不完全相同&#xff0c;这篇文章出一期纯FPGA实现的高速存储方案。用纯fpga实现高速存储板卡有易国产化&#xff0c;功耗低和体积小等特点&#xff0c;缺点就是灵活性不是很强&#xff0c;实现标准ext4和nfs文件系统…

数据仓库建模基础理论-01-为什么需要数据建模?

一、什么是数据模型&#xff1f; 数据模型是数据库的基础结构&#xff0c;用于描述和组织数据的方式。 它不仅是数据库的底层结构&#xff0c;还是一个概念性工具&#xff0c;帮助理解数据的含义和关系。 数据模型包括数据本身、数据之间的关系、数据的语义&#xff08;含义和…

C++ | Leetcode C++题解之第206题反转链表

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode* reverseList(ListNode* head) {if (!head || !head->next) {return head;}ListNode* newHead reverseList(head->next);head->next->next head;head->next nullptr;return newHead;} …

一秒记单词:音通义通,一秒牢记

一秒记单词&#xff0c;从小学到高中&#xff0c;一秒牢记 一、小学生记单词&#xff0c;快速突破 1.1 好的开始&#xff0c;是成功的一半 sun n.太阳 【通】尚 moon n.月亮 【通】母恩 mother n.母亲&#xff0c;妈 【通】妈汁 sea n.海&#xff0c;大海 【通】细 sand …

【MySQL基础篇】SQL指令:DQL及DCL

1、DQL DQL - 介绍 DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据表中的记录。&#xff08;在MySQL中应用是最为广泛的&#xff09; 查询关键字&#xff1a;SELECT DQL - 语法 SELECT 字段列表 FROM 表名列表 WHER…

【人工智能学习之图像操作(六)】

【人工智能学习之图像操作&#xff08;六&#xff09;】 Hough变换直线检测圆检测 图像分割 Hough变换 在图像处理中&#xff0c;霍夫变换用来检测任意能够用数学公式表达的形状&#xff0c;即使这个形状被破坏或者有点扭曲 直线检测 import cv2 import numpy as np image …

利用微信开放标签<wx-open-launch-weapp>在H5中跳转微信小程序报错完美的解决方案

一、报错&#xff1a; [WXTAG] [JSCORE] The slot <template> or <script type"text/wxtag-template"> of <wx-open-launch-weapp> is missing 二、源码 官方源代码如下&#xff0c;<script type"text/wxtag-template"></sc…

美团外卖搜索基于Elasticsearch的优化实践--图文解析

美团外卖搜索基于Elasticsearch的优化实践–图文解析 前言 美团在外卖搜索业务场景中大规模地使用了 Elasticsearch 作为底层检索引擎&#xff0c;随着业务量越来越大&#xff0c;检索速度变慢了&#xff0c;CPU快累趴了&#xff0c;所以要进行优化。经过检测&#xff0c;发现…

[SAP ABAP] 数据字典

ABAP数据字典是定义和管理数据库对象的工具 系统的所有全局数据类型以及数据库表结构等都需要在数据字典中创建和维护(数据字典中的对象对所有ABAP程序都是全局的) 通过数据字典&#xff0c;我们可以把数据库对象管理好&#xff0c;后续才能顺利的进行功能开发&#xff0c;SA…

集合,Collection接口

可动态保存任意多个对象&#xff0c;使用比较方便 提供了一系列方便操作对象的方法&#xff1a;add&#xff0c;remove&#xff0c;set&#xff0c;get等 使用集合添加删除新元素&#xff0c;代码简洁明了 单列集合 多列集合 Collection接口 常用方法 List list new Arra…

多媒体基础

笔者按&#xff1a; 昨日复习的信息网络安全约莫是挂了&#xff0c;常言道&#xff1a;知耻而后勇。诚如斯言 于是决心多媒体是不能再挂了&#xff0c;不然直接变成xxx之流&#xff0c;自增笑耳 语雀链接&#xff1a;多媒体基础 一.多媒体计算机概述 媒体&#xff1a;承载信息…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-21多输入多输出通道

21多输入多输出通道 import torch from d2l import torch as d2ldef corr2d(X, K):"""计算二维互相关运算"""h, w K.shapeY torch.zeros((X.shape[0] - h 1, X.shape[1] - w 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,…

go语言DAY7 字典Map 指针 结构体 函数

Go中Map底层原理剖析_go map底层实现-CSDN博客 目录 Map 键值对key,value 注意&#xff1a; map唯一确定的key值通过哈希运算得出哈希值 一、 map的声明及初始化&#xff1a; 二、 map的增删改查操作&#xff1a; 三、 map的赋值操作与切片对比&#xff1a; 四、 通用所有…

[leetcode hot 150]第一百二十二题,买卖股票的最佳时机Ⅱ

题目&#xff1a; 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大…

【C++】初识C++(一)

一.什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度 的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20世纪80年代&#xff0c; 计算机界提出了OOP(object o…

图形处理单元(GPU)在现代计算中的应用与挑战(研究论文框架)

摘要:随着高性能计算需求的日益增长,图形处理单元(GPU)已从专业的图形渲染处理器转变为具有高性能并行处理能力的多功能计算平台。本文将探讨GPU的核心优势、编程模型、在不同领域的应用以及面临的挑战和限制。此外,还将讨论GPU技术的未来发展趋势和潜在的研究机会。 关键…

mongodb 查询语句学习笔记

基础查询 正则查询 {status: A,$or: [{ qty: { $lt: 30 } }, { item: { $regex: ^p } }] }AND 查询 { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" }OR 查询 { $or: [ { status: "A" }, { qty: { $lt: 30 } …

2024年机动车签字授权人题库,助你冲刺!绝对不会让你后悔!

61.&#xff08;&#xff09;使汽车按驾驶人选定的方向行驶。 A.传动系统 B.行驶系统 C.转向系统 D.制动系统 答案&#xff1a;C 62.&#xff08;&#xff09;使汽车各总成及部件安装在适当的位置&#xff0c;对全车起支承作用以保证汽车正常行驶。 A.传动系统 B.行驶系…

HDFS学习

3.5 HDFS存储原理 3.5.1 冗余数据保存 作为一个分布式文件系统&#xff0c;为了保证系统的容错性和可用性&#xff0c;HDFS采用了多副本方式对数据进行冗余存储&#xff0c;通常一个数据块的多个副本会被分布到不同的数据节点上。 如图所示&#xff0c;数据块1被分别存放到…

石油化工厂为什么要用专业防爆手机?

防爆手机之所以必须使用专业设计的产品&#xff0c;主要是出于安全考虑&#xff0c;以防止在易燃易爆环境中因手机使用不当引发爆炸事故。以下几点详细解释了使用专业化工防爆手机的必要性&#xff1a; 本质安全设计&#xff1a;顶坚专业防爆手机采用了本质安全&#xff08;本安…