【数据结构】排序算法篇一

news/2024/9/16 14:00:21/ 标签: 排序算法, 数据结构, 算法

数据结构算法>排序算法篇一

  • 1. 插入排序
    • (1)基本思想:
    • (2)动态图解:
    • (3)具体步骤:
    • (4)代码实现:
    • (5)特性总结:
  • 2. 希尔排序( 缩小增量排序 )
    • (1)基本思想:
    • (2)静态图解:
    • (3)具体步骤:
    • (4)代码实现:
    • (5)特性总结:
  • 3. 堆排序
    • (1)基本思想:
    • (2)具体步骤:
    • (3)代码实现:
    • (4)特性总结:
  • 4. 选择排序
    • (1)基本思想:
    • (2)动态图解:
    • (3)具体步骤:
    • (4)代码实现:
    • (5)特性总结:

1. 插入排序

(1)基本思想:

由下图可以得出:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

(2)动态图解:

在这里插入图片描述

(3)具体步骤:

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

(4)代码实现:

void InsertSort(int *a,int aSize)
{for (int i = 1; i < aSize; i++){int end = i - 1;int tmp = a[i];//tmp需要保存的是数组i处的值(a[i]),如果存下标,会被a[end + 1] = a[end];该句代码覆盖while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];end--;}else{break;}a[end + 1] = tmp;}}
}

(5)特性总结:

  1. 元素集合越接近有序,直接插入算法>排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的算法>排序算法
  4. 稳定性:稳定

2. 希尔排序( 缩小增量排序 )

(1)基本思想:

先选定一个整数(gap),把待排序文件中所有记录分成个若干组,所有距离为gap的记录分在同一组内,并对每一组内的记录进行排序。然后gap缩小,重复上述分组和排序的工作。当gap到达=1时,所有记录在统一组内排好序。

(2)静态图解:

在这里插入图片描述

(3)具体步骤:

该排序部分类似于插入排序

(4)代码实现:

void ShellSort(int* a, int aSize)
{int gap = aSize;while (gap > 1){//gap > 1 预排序//gap = 1 插入排序gap /= 2;//或gab/=3+1;保证gab最后可等于1,此时即为最后一遍插入排序for (int i = 0; i < aSize - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}a[end + gap] = tmp;}}}
}

(5)特性总结:

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快,可以达到优化的效果。
  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,因此希尔排序的时间复杂度未固定

在这里插入图片描述

3. 堆排序

(1)基本思想:

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种算法>排序算法,它是选择排序的一种。它是
通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆

(2)具体步骤:

先实现一个向下调整建大堆函数,利用其将欲排序数组建为大堆,然后按照下面思想实现升序
在这里插入图片描述

(3)代码实现:

void Swap(int* p, int* q)
{int tmp = *p;*p = *q;*q = tmp;
}
void AdjustDown(int* a, int aSize, int parent)//向下调整建大堆
{int child = 2 * parent + 1;while (child < aSize){//不要漏掉条件child + 1 < aSizeif (child + 1 < aSize && a[child] < a[child + 1]){child++;}//此时a[child]为大孩子if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = 2 * parent + 1;}else{break;}}
}
void HeapSort(int* a, int aSize)
{for (int i = (aSize - 1 - 1) / 2; i >= 0; i--)//将数组a建为大堆{AdjustDown(a, aSize, i);}//实现升序int end = aSize - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);end--;}
}

(4)特性总结:

  1. 堆排序使用堆来选数,效率就高了很多。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

4. 选择排序

(1)基本思想:

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

(2)动态图解:

在这里插入图片描述

(3)具体步骤:

在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素,若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换,在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个元素

(4)代码实现:

void Swap(int* p, int* q)
{int tmp = *p;*p = *q;*q = tmp;
}
void SelectSort(int* a, int aSize)
{for (int j = 0; j < aSize; j++){int min = j;for (int i = j; i < aSize; i++){if (a[i] < a[min]){min = i;}}Swap(&a[min], &a[j]);}
}

(5)特性总结:

  1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

http://www.ppmy.cn/news/1521505.html

相关文章

Flutter中添加崩溃分析

前言 Crashlytics的作用是在移动应用程序发生崩溃时&#xff0c;及时收集崩溃信息并发送给开发人员&#xff0c;以帮助开发人员快速定位和修复问题&#xff0c;从而提高应用程序的稳定性和用户体验 Crashlytics的原理是通过集成到应用程序中的SDK&#xff0c;在应用程序崩溃时…

【Next】2. 项目构建

打开 Next.js 的官方文档&#xff1a;https://nextjs.org/docs/getting-started/installation&#xff08;国内文档不够新&#xff09; Next.js 版本 14.2 &#xff0c; Node.js 的版本要求必须 > 18.18。 Next 有两种开发模式&#xff0c;下面讲新的 APP Router。 创建项…

【2024数模国赛赛题思路公开】国赛A题思路丨附可运行代码丨无偿自提

2024年国赛A题解题思路 【题目分析】 问题1&#xff1a;舞龙队沿螺距为55 cm的等距螺线顺时针盘入&#xff0c;给出300秒内舞龙队每秒的位置和速度 分析思路&#xff1a; 螺线方程&#xff1a; 需要建立螺线方程&#xff0c;以便描述龙头及每节板凳的位置。螺线是基于极坐标系…

uni-app应用更新(Android端)

关于app更新&#xff0c;uni-app官方推荐的是 uni-upgrade-center&#xff0c;看了下比较繁琐&#xff0c;因此这里自己实现检查更新并下载安装的逻辑。 1.界面效果 界面中的弹框和 进度条采用了uView 提供的组件 2.检查更新并下载安装 一、版本信息配置在服务端&#xff0c…

【Spring】Spring MVC 入门(2)

本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。 目录 本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。…

论文解读 | KDD2024 演化图上的森林矩阵快速计算

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者直播讲解回放&#xff01; 作者简介 孙浩鑫&#xff0c;复旦大学博士生&#xff0c;主要研究方向为大规模图上快速算法设计。 概述 森林矩阵在网络科学、观点动力学和机器学习相关应用中…

docker将容器保存为镜像

docker如何将运行的容器保存为镜像 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 其中&#xff1a; [OPTIONS] 是可选参数&#xff0c;如 -m 用于提供提交信息。 CONTAINER 是要提交的容器的ID或名称。 [REPOSITORY[:TAG]] 是新镜像的仓库名和标签&#xff0c;如果…

翻译论文的关键部分 | Parallel Tiled QR Factorization for Multicore Architectures

SSRFB DTSQT2 DLARFB DGEQT2 1, 对角子矩阵分解 DGEQT2 这个例程被开发出来&#xff0c;用于针对对角Tile子矩阵&#xff1a; &#xff0c;执行不分块的QR分解。 这个运算产生&#xff1a; 一个上三角矩阵 一个酉下三角矩阵&#xff0c;这个矩阵包含 b 个 Householder 反光面…

力扣96-不同的二叉搜索树(Java详细题解)

题目链接&#xff1a;96. 不同的二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 …

2024下半年软考中级【软件设计师】备考攻略

备考软件设计师&#xff0c;准备好复习资料&#xff0c;就是教材真题考试大纲三件套&#xff0c;然后再加3个月左右的复习长度&#xff0c;保证每一天2个小时的复习时间&#xff01; 首先&#xff0c;需要准备的资料书是教材。虽然教材很厚很厚&#xff0c;厚到不想看&#xf…

zdppy+vue3+onlyoffice文档管理系统实战 20240905 上课笔记 权限校验中间件开始

目前 1、登录功能基本完成2、缺对token的校验 如何校验token 必须保证token是有效的&#xff1a; 1、防止篡改&#xff0c;也就是能够重新解析为加密前的内容2、过期校验&#xff0c;token必须在有效期内3、可做可不做&#xff0c;必须保证token里面的用户名和用户ID能够匹…

何为图像处理,有哪些处理方法

图像处理是计算机科学中的一个重要领域&#xff0c;涉及到图像的获取、处理、分析和理解。在深度学习和计算机视觉中&#xff0c;图像处理技术尤为重要&#xff0c;它为图像识别、图像生成等高级任务提供了基础支持。图像处理方法包括图像增强、图像滤波和图像分割等。图像处理…

leetcode第142题:环形链表 ||(C语言+引申问题全解)

思路1&#xff08;思路难、代码简单&#xff09;&#xff1a; slow一次走一步&#xff0c;fast一次走两步&#xff1b;相遇时搞个meet&#xff0c;再搞一个head&#xff0c;head和meet一起走&#xff0c;每次走一步&#xff1b;head、meet相遇处&#xff0c;即为结果。 思路解释…

020 现代数据中心的路由与交换架构

引言 现代数据中心的设计必须兼顾高性能、高可用性和灵活性&#xff0c;以满足云计算、大数据、人工智能等应用的需求。在这样的背景下&#xff0c;数据中心的路由与交换架构设计显得尤为重要。Spine-Leaf架构、BGP路由优化以及高密度虚拟化环境中的交换技术&#xff0c;成为了…

HarmonyOS开发实战( Beta5.0)DevEco Device Tool开发环境搭建实践

通常在嵌入式开发中&#xff0c;很多开发者习惯于使用Windows进行代码的编辑&#xff0c;比如使用Windows的Visual Studio Code进行OpenHarmony代码的开发。但当前阶段&#xff0c;大部分的开发板源码还不支持在Windows环境下进行编译&#xff0c;如Hi3516、Hi3518系列开发板。…

基于智能巡检机器人的算力评估指标及其应用场景分析

随着工业自动化和智能化的发展&#xff0c;智能巡检机器人在各类复杂环境中的应用日益广泛。机器人通常需要在复杂、多变的环境中自主执行任务&#xff0c;如设备检测、数据采集、故障诊断等。为了确保巡检机器人的高效运行&#xff0c;计算能力&#xff08;算力&#xff09;的…

数据分析面试常见50个问题及解答要点(五)

为了帮助各位学习数据分析的小伙伴们成功拿到offer&#xff01;本期给大家整理了一些数据分析面试时的高频问题&#xff0c;分享给大家 数据分析高频面试50题&#xff0c;点击下方链接进行下载完整版&#xff0c;下面展示部分面试题&#xff0c;希望大家积极点赞收藏加关注&…

react自学(6) 部署到tomcat中

1.设置项目名 在package.json文件配置 "homepage": "/myapp"2.设置Router类型 说明&#xff1a;由于本文是写部署tomcat&#xff0c;因此使用HashRouter类型&#xff0c;不然会出现空白&#xff1b;如果使用springboot或在apche/nginx&#xff0c;则可以…

从 ES|QL 到 Python 中的原生 Pandas 数据帧

作者&#xff1a;来自 Elastic Quentin Pradet 自 Elasticsearch 8.15 或 Elasticsearch Serverless 以来&#xff0c;ES|QL 响应支持 Apache Arrow 流式传输格式。这篇博文将向你展示如何在 Python 中利用它。在之前的一篇博文中&#xff0c;我演示了如何使用 CSV 作为中间表示…

win11环境android studio中AVD目录修改问题解决

起始原因是我搭建Android studio 调试一个app时&#xff0c;运行模拟器时 出现“The emulator process for AVD xxx has terminated.”的错误 DEBUG | trying to load skin file D:\android\skins\\pixel_6\layout ERROR | Not enough space to create userdata partition…