排序算法剖析

文章目录

  • 排序算法浅谈
    • 参考资料
    • 评价指标
    • 可视化工具
    • 概览
  • 插入排序
  • 折半插入排序
  • 希尔排序
  • 冒泡排序
  • 快速排序
  • 简单选择排序
  • 堆排序
  • 归并排序
  • 基数排序

排序算法浅谈

参考资料

数据结构与算法

评价指标

  • 稳定性:两个相同的关键字排序过后相对位置不发生变化
  • 时间复杂度
  • 空间复杂度
  • 适用性:是否适用于链表

可视化工具

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

概览

排序算法稳定性平均时间复杂度平均 空间复杂度备注
插入排序稳定O(n^2)O(1)基本有序时时间复杂度接近O(n)
折半插入排序稳定O(n^2)O(1)查找插入位置是使用折半查找
希尔排序不稳定O(n^1.3)O(1)利用基本有序可以降低插入排序时间复杂度的思想,将数据分组进行插入排序
冒泡排序稳定O(n^2)O(1)基本有序时时间复杂度接近O(n),如果一趟冒泡排序过程中没有发生交换,则说明序列已经有序
快速排序不稳定O(nlogn)O(logn)每次至少确定一个元素位置
选择排序不稳定O(n^2)O(1)每—趟在待排序元素中选取关键字最小的元素加入有序子序列;时间复杂度与初始状态无关
堆排序不稳定O(nlogn)O(1)将序列初始化为堆,然后不断取堆顶元素,并不断调整堆使其保持堆的性质
归并排序稳定O(nlogn)O(n)不断递归合并两个有序序列
基数排序稳定O(d(n+r))拆分成多个位,并按位的权重从小到大进行分配与收集

插入排序

  • 算法思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。
  • 稳定性:稳定
  • 时间复杂度:最好O(n),平均O(n^2),最坏O(n^2)
  • 特点: 当数组的元素基本有序,那么插入排序的时间复杂度接近O(n)
  • 适用性:适用链表
/*** 插入排序* 每次将第i个元素,一次与前i个元素比较,正确地插入到[0, i]的序列中* 时间复杂度 O(n²)** 插入排序有提前终止的可能,效率比选择排序高一点* 当数组的元素基本有序,那么插入排序的时间复杂度接近O(n)* @param arr 待排序数组*/public static void insertionSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int num = arr[i];int j;// 前面的元素是否比当前元素大for (j = i; j > 0 && num < arr[j-1]; j--) {arr[j] = arr[j - 1];}arr[j] = num;}}

折半插入排序

  • 算法思想:对于插入排序,要将元素插入到前面的有序序列,由于前面的序列已经有序,那么在查找插入位置时可以使用二分查找算法,也就是折半插入排序
  • 稳定性:稳定
  • 时间复杂度:相比于插入排序只能较少元素比较次数,无法减少元素移动的次数,平均时间复杂度依旧是O(n^2)
  • 特点: 当数组的元素基本有序,那么插入排序的时间复杂度接近O(n)
  • 适用性:不适用链表
    在这里插入图片描述

希尔排序

  • 算法思想:先将待排序表分割成若干形如 L[i, i +d, i + 2d…, i + kd]的“特殊”子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止。(n/2, n/4, n/8, …, 1)
  • 稳定性:不稳定
  • 时间复杂度:最坏O(n^2),平均O(n^1.3)
  • 适用性:不适用链表在这里插入图片描述

在这里插入图片描述

冒泡排序

  • 算法思想:从后往前((或从前往后)两两比较相邻元素的值,若为逆序〈(即A[i-1]>A[i]),则交换它们,直到序列比较完。称这样过程为“一趟”冒泡排序。如果一趟冒泡排序过程中没有发生交换,则说明序列已经有序。
  • 稳定性:稳定
  • 时间复杂度:最好O(n),平均O(n^2)
  • 适用性:适用于链表
  • 特点: 当数组的元素基本有序,那么冒泡排序的时间复杂度接近O(n)

在这里插入图片描述

快速排序

  • 算法思想∶在待排序表L[1…n]中任取一个元素pivot作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两部分L[1…k-1]和LIk+1…n],使得L[1…k-1]中的所有元素小于pivot,L[k+1…n]中的所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一次“划分”。然后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。
  • 时间复杂度:平均最好O(nlogn),最坏O(n^2)(取决于每个划分是否均衡)
  • 空间复杂度:最好O(logn),最坏O(n)
  • 适用性:不适用于链表
  • 稳定性:不稳定
    在这里插入图片描述
    在这里插入图片描述

简单选择排序

  • 算法思想:每—趟在待排序元素中选取关键字最小的元素加入有序子序列
  • 时间复杂度:O(n^2)无优化空间
  • 适用性:适用于链表
  • 稳定性:不稳定
/*** 每进行一次外层循环找出第i小的元素* 选择排序,升序* 每次都从 [i, n) 中找出最小的元素* 时间复杂度 O(n²)* @param arr 待排序数组*/
public static void selectionSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {int minIndex = i;for (int j = i + 1; j < arr.length; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}swap(arr, i, minIndex);}
}

堆排序

  • 大根堆:以完全二叉树顺序存储的方式来看一个数组,每个非终端节点都大于它的左(2i)右(2i+1)节点,非终端节点的编号i <= n/2
  • 算法思想:每一趟将堆顶元素加入有序子序列(与待排序序列中的最后一个元素交换),并将待排序序列再次调整为大根堆
  • 时间复杂度:建堆O(n),整体O(nlogn)
  • 空间复杂度:O(1)
  • 适用性:不适用于链表
  • 稳定性:不稳定
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

归并排序

  • 算法思想:每次将两个有序子序列合并,递归到每个子序列大小为1
  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(n)
  • 适用性:适用于链表
  • 稳定性:稳定
public static void mergeSort(int[] arr) {mergeSort(arr, 0, arr.length - 1);
}/*** 把当前要排序的数组分成两半,层层递归,直至剩余一个元素* 将两半排序好的数组进行合并
*/
private static void mergeSort(int[] arr, int l, int r) {if (l >= r) {return;}int mid = l + (r-l)/2;mergeSort(arr, l, mid);mergeSort(arr, mid + 1, r);merge(arr, l, mid, r);
}private static void merge(int[] arr, int l, int mid, int r) {int[] aux = new int[r-l+1];for (int i = l; i <= r; i++) {aux[i-l] = arr[i];}int left = l;int right = mid + 1;for (int i = l; i <=r; i++) {if (left > mid) {arr[i] = aux[right - l];right ++;} else if (right > r) {arr[i] = aux[left - l];left ++;} else if (aux[left -l] < aux[right - l]) {arr[i] = aux[left - l];left ++;} else {arr[i] = aux[right - l];right ++;}}
}

基数排序

  • 算法思想:分别以个位,十位,百位等(关键字权重递增,百位对关键字的大小影响更大)进行排序和收集
  • 空间复杂度:O®
  • 时间复杂度:O(d(n+r))
  • 稳定性:稳定
  • 应用场景
    • 数据元素的关键字可以方便地拆分为d组,且d较小
    • 每组关键字的取值范围不大,即r较小
    • 数据元素个数n较大
      在这里插入图片描述
      在这里插入图片描述

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

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

相关文章

C# Blazor Server 调用海康H5Player播放摄像头画面

目标 调用海康综合安防平台api&#xff0c;通过摄像头的cameraIndexCode调用【获取监控点预览取流URLv2】api&#xff0c;得到websocket 的url&#xff0c;然后在blazor server中使用htplayer.js播放摄像头实时画面。 步骤 根据摄像头名字&#xff0c;调用【查询监控点列表v2…

python配置环境变量

方法一&#xff1a;首先卸载重新安装&#xff0c;在安装时勾选增加环境变量 方法二&#xff1a;我的电脑-属性-高级系统配置 手动添加环境变量&#xff0c;路径为python的安装路径 检查&#xff1a;查看环境变量是否安装成功 安装第三方lib winr&#xff0c;输入cmd pip ins…

线程互斥函数的例子

代码 #include<stdio.h> #include<pthread.h> #include<sched.h> void *producter_f(void *arg); void *consumer_f(void *arg); int buffer_has_item0; pthread_mutex_t mutex; int running1; int main(void) {pthread_t consumer_t;pthread_t producter_t…

Linux学习笔记(六):服务管理,监控,RPM包管理,yum包管理工具,Linux启动管理,网络管理

Linux学习笔记&#xff08;六&#xff09;&#xff1a;服务管理&#xff0c;监控&#xff0c;RPM包管理&#xff0c;yum包管理工具&#xff0c;Linux启动管理&#xff0c;网络管理 1. 服务管理 1.1 service 启动/停止服务 service 命令是最常用的服务管理工具之一&#xff0c…

音视频入门基础:FLV专题(7)——Tag header简介

一、引言 从《音视频入门基础&#xff1a;FLV专题&#xff08;3&#xff09;——FLV header简介》中可以知道&#xff0c; 在FLV header之后&#xff0c;FLV文件剩下的部分应由PreviousTagSize和Tag组成。FLV文件 FLV header PreviousTagSize0 Tag1 PreviousTagSize1 Ta…

Python或R时偏移算法实现

&#x1f3af;要点 计算单变量或多变量时序距离&#xff0c;使用欧几里得、曼哈顿等函数量化不同时序差异。量化生成时序之间接近度相似性矩阵。使用高尔距离和堪培拉距离等相似度测量。实现最小方差匹配算法&#xff0c;绘制步进模式的图形表示。其他语言包算法实现。 &…

【AI知识点】NP 难问题(NP-Hard Problem)

NP 难问题&#xff08;NP-Hard Problem&#xff09; 是计算复杂性理论中的一个重要概念&#xff0c;描述了那些非常难以求解的问题。NP 难问题中的“NP”代表“非确定性多项式时间”&#xff08;Nondeterministic Polynomial time&#xff09;。这些问题的特性使得求解它们的最…

[uni-app]小兔鲜-07订单+支付

订单模块 基本信息渲染 import type { OrderState } from /services/constants import type { AddressItem } from ./address import type { PageParams } from /types/global/** 获取预付订单 返回信息 */ export type OrderPreResult {/** 商品集合 [ 商品信息 ] */goods: …

[数据集][目标检测]辣椒缺陷检测数据集VOC+YOLO格式695张5类别

重要说明&#xff1a;数据集图片里面都是一个辣椒&#xff0c;请仔细查看图片预览&#xff0c;确认符合要求下载 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文…

jenkins 构建报错ERROR: Error fetching remote repo ‘origin‘

问题描述 修改项目的仓库地址后&#xff0c;使用jenkins构建报错 Running as SYSTEM Building in workspace /var/jenkins_home/workspace/【测试】客户端/client-fonchain-main The recommended git tool is: NONE using credential 680a5841-cfa5-4d8a-bb38-977f796c26dd&g…

小白快速上手 Docker 03 | Docker数据卷

数据卷 在前面使用Docker时&#xff0c;可能会遇到以下几个问题&#xff1a; 当Docker 里的容器挂了以后打不开&#xff0c;这时候只有删除该容器了&#xff0c;但删除容器会连容器中的产生的数据也一起删除了&#xff0c;大部分场景下这是不能接受的。Docker容器与容器之间不…

【图论】1 (最小生成树虚拟点思想)C.戴森球计划 题解

一. 题目 题目描述 输入输出格式 样例 样例1 样例2 & 样例解释 数据范围 二. 思路 对于前20%数据 解法 因为保证了 x i 1 x_i 1 xi​1&#xff0c;也就是说这些点都在 x 1 x 1 x1 这条直线上。 那么最优解必定是在 c i c_i ci​ 最小的点上建发电站&#xff0c…

4.人员管理模块(开始预备工作)——帝可得管理系统

目录 前言一、需求分析1.页面原型2.创建SQL 二、使用若依框架生成前后端代码1.添加目录菜单2.添加数据字典3.配置代码生成信息4.下载代码并导入项目5.快速导入方法 三、 总结 前言 提示&#xff1a;本篇讲解人员管理模块的开发的预备工作&#xff0c;包括需求分析、生成代码、…

uniapp+Android面向网络学习的时间管理工具软件 微信小程序

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户功能…

最新版本SkyWalking【10.1.0】部署

这里写目录标题 前言前置条件启动Skywalking下载解压启动说明 集成Skywalking Agent下载Agent在IDEA中添加agent启动应用并访问SpringBoot接口 说明 前言 基于当前最新版10.1.0搭建skywalking 前置条件 装有JDK11版本的环境了解SpringBoot相关知识 启动Skywalking 下载 地…

golang grpc进阶

protobuf 官方文档 基本数据类型 .proto TypeNotesGo Typedoublefloat64floatfloat32int32使用变长编码&#xff0c;对于负值的效率很低&#xff0c;如果你的域有可能有负值&#xff0c;请使用sint64替代int32uint32使用变长编码uint32uint64使用变长编码uint64sint32使用变长…

Linux:无法为立即文档创建临时文件: 设备上没有空间

虚拟机磁盘空间不足解决记录 1、问题描述2、问题解决 1、问题描述 在命令行输入命令按Tab键时出现如下报错&#xff1a; 很明显&#xff0c;设备上没有空间&#xff0c;即磁盘空间不足。通过命令查看具体情况如下&#xff1a; df -h2、问题解决 首先想到的是虚拟机扩容。关机虚…

每日学习一个数据结构-树

文章目录 树的相关概念一、树的定义二、树的基本术语三、树的分类四、特殊类型的树五、树的遍历六、树的应用场景 树的遍历一、前序遍历二、中序遍历三、后序遍历使用java代码实现遍历总结 树的相关概念 树是一种重要的非线性数据结构&#xff0c;在计算机科学中有着广泛的应用…

C++IO流

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 CIO流 收录于专栏 [C进阶学习] 本专栏旨在分享学习C的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. C语言的输入与输出 2. 流是什…

(PyTorch) 深度学习框架-介绍篇

前言 在当今科技飞速发展的时代&#xff0c;人工智能尤其是深度学习领域正以惊人的速度改变着我们的世界。从图像识别、语音处理到自然语言处理&#xff0c;深度学习技术在各个领域都取得了显著的成就&#xff0c;为解决复杂的现实问题提供了强大的工具和方法。 PyTorch 是一个…