• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思想人生从关注生活开始
博客园    首页    新随笔    联系   管理    订阅  订阅

常用的10种排序算法概述

前言

时间复杂度和空间复杂度是算法分析中非常重要的两个概念,它们分别用于衡量算法执行所需的时间和空间资源。

一、时间复杂度

定义:

时间复杂度是指执行算法所需要的计算工作量,它描述了算法运行时间与输入数据规模之间的关系。时间复杂度通常用大O符号(Big O notation)来表示,即O(f(n)),其中n是输入数据的大小,f(n)是算法执行时间的某种函数。

计算方法:


确定基本操作:首先,找出算法中的基本操作,即算法执行过程中重复次数最多的操作。
分析基本操作次数:分析基本操作的执行次数与输入数据规模n的关系。
忽略低阶项和系数:在计算时间复杂度时,通常忽略掉常数项、低阶项以及最高阶项的系数,只保留最高阶项。

常见的时间复杂度:

O(1):常数时间复杂度,算法的执行时间不随输入数据规模变化。
O(log n):对数时间复杂度,如二分查找算法。
O(n):线性时间复杂度,如遍历数组或列表中的每个元素。
O(n log n):线性对数时间复杂度,如快速排序、归并排序等高效排序算法。
O(n^2):平方时间复杂度,如冒泡排序、选择排序等简单排序算法。
O(n^3)、O(2^n)、O(n!):随着问题规模的增长,所需时间急剧增加,分别对应立方、指数、阶乘复杂度。

二、空间复杂度

定义:

空间复杂度是指算法在运行过程中临时占用存储空间大小的量度,它描述了算法执行时所需内存空间与输入数据规模之间的关系。空间复杂度同样用大O符号表示。

计算方法:

空间复杂度的计算方法与时间复杂度相似,也是关注随着问题规模增长,算法所需最大额外空间的变化趋势。在计算时,需要考虑算法本身占用的空间以及算法运行过程中需要的额外空间。

常见的空间复杂度


O(1):算法使用的额外空间不随输入数据规模改变,如原地排序算法。
O(n):额外空间正比于输入数据规模,如某些动态规划问题中需要的数组。
O(n^2):随着输入规模增大,所需空间平方增长,例如某些矩阵运算。

三、总结


时间复杂度和空间复杂度是衡量算法性能的重要指标。在算法设计和分析中,我们需要根据具体问题的需求,在时间和空间之间做出权衡,以找到最优的算法解决方案。同时,了解常见的时间复杂度和空间复杂度类型,有助于我们更好地理解和评估算法的性能。

排序算法

常用的排序算法有很多种,每种都有其特定的应用场景和优缺点。以下是一些常见的排序算法:

  1. 冒泡排序(Bubble Sort)

    • 原理:通过重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
    • 时间复杂度:O(n^2)(最好和最坏情况)
    • 空间复杂度:O(1)
  2. 选择排序(Selection Sort)

    • 原理:首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
    • 时间复杂度:O(n^2)(最好和最坏情况)
    • 空间复杂度:O(1)
  3. 插入排序(Insertion Sort)

    • 原理:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
    • 时间复杂度:O(n^2)(最好和最坏情况),但在部分有序的情况下可以接近O(n)
    • 空间复杂度:O(1)
  4. 希尔排序(Shell Sort)

    • 原理:是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
    • 时间复杂度:O(n log n) 到 O(n^2)(取决于增量序列的选择)
    • 空间复杂度:O(1)
  5. 归并排序(Merge Sort)

    • 原理:采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
    • 时间复杂度:O(n log n)(最好和最坏情况)
    • 空间复杂度:O(n)(递归实现时)或 O(1)(迭代实现时)
  6. 快速排序(Quick Sort)

    • 原理:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
    • 时间复杂度:O(n log n)(平均情况),O(n^2)(最坏情况)
    • 空间复杂度:O(log n)(递归栈空间)
  7. 堆排序(Heap Sort)

    • 原理:是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。
    • 时间复杂度:O(n log n)(最好和最坏情况)
    • 空间复杂度:O(1)
  8. 计数排序(Counting Sort)

    • 原理:非比较型整数排序算法,其原理是将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
    • 时间复杂度:O(n+k)(k是整数的范围)
    • 空间复杂度:O(n+k)
  9. 桶排序(Bucket Sort)

    • 原理:是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:首先,要使得数据分散得尽可能均匀;其次,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。
    • 时间复杂度:O(n+n^2/k+k)(最好情况),O(n^2)(最坏情况)
    • 空间复杂度:O(n+k)
  10. 基数排序(Radix Sort)

    • 原理:按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。
    • 时间复杂度:O(nk)(k是最大数的位数)
    • 空间复杂度:O(n+k)

这些排序算法的选择取决于数据的特性(如大小、分布、是否已部分排序等)以及可用资源的限制(如内存和时间)。

其他相关排序算法详解文章汇总

常用的排序算法之基数排序(Radix Sort)

常用的排序算法之桶排序(Bucket Sort) 

常用的排序算法之计数排序(Counting Sort) 

常用的排序算法之堆排序(Heap Sort) 

常用的排序算法之快速排序(Quick Sort)

常用的排序算法之归并排序(Merge Sort)

常用的排序算法之希尔排序(Shell Sort)

常用的排序算法之插入排序(Insertion Sort)

常用的排序算法之选择排序(Selection Sort)

常用的排序算法之冒泡排序(Bubble Sort)

 

posted @ 2024-05-27 13:30  JackYang  阅读(121)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3