首页 > 编程语言 >排序算法

排序算法

时间:2024-09-12 14:15:21浏览次数:7  
标签:Sort 复杂度 元素 算法 数组 排序

排序算法是计算机科学中的基本算法之一,旨在将一组数据按照特定顺序(通常是升序或降序)排列。以下是一些常见的排序算法及其特点:

1. 冒泡排序 (Bubble Sort)

  • 描述:通过重复遍历待排序的数组,比较相邻的元素并交换它们的位置,直到没有需要交换的元素为止。
  • 时间复杂度:最坏和平均情况下为 O(n²),最好情况下为 O(n)(当数组已经排序时)。
  • 空间复杂度:O(1)(原地排序)。
  • 稳定性:稳定。

2. 选择排序 (Selection Sort)

  • 描述:每次从未排序部分中选择最小(或最大)元素,将其放到已排序部分的末尾。
  • 时间复杂度:O(n²)(无论是最坏情况还是最好情况)。
  • 空间复杂度:O(1)(原地排序)。
  • 稳定性:不稳定。

3. 插入排序 (Insertion Sort)

  • 描述:将数组分为已排序和未排序两部分,逐步将未排序部分的元素插入到已排序部分的合适位置。
  • 时间复杂度:最坏和平均情况下为 O(n²),最好情况下为 O(n)(当数组已经排序时)。
  • 空间复杂度:O(1)(原地排序)。
  • 稳定性:稳定。

4. 希尔排序 (Shell Sort)

  • 描述:基于插入排序的思想,通过将数据分为多个子序列(根据一定的间隔),对每个子序列进行插入排序,然后逐步减小间隔,最终对整个数组进行排序。
  • 时间复杂度:取决于间隔序列,平均情况下为 O(n log n) 到 O(n²),最坏情况下为 O(n²)。
  • 空间复杂度:O(1)(原地排序)。
  • 稳定性:不稳定。

5. 归并排序 (Merge Sort)

  • 描述:采用分治法,将数组分成两半,分别排序后再合并两个已排序的部分。
  • 时间复杂度:O(n log n)(无论是最坏、最好还是平均情况)。
  • 空间复杂度:O(n)(需要额外的存储空间)。
  • 稳定性:稳定。

6. 快速排序 (Quick Sort)

  • 描述:选择一个基准元素,将数组划分为比基准小和大的两个部分,然后递归地对这两部分进行排序。
  • 时间复杂度:最坏情况下为 O(n²)(当数组已经排序时),平均和最好情况下为 O(n log n)。
  • 空间复杂度:O(log n)(递归调用栈)。
  • 稳定性:不稳定。

7. 堆排序 (Heap Sort)

  • 描述:利用堆这种数据结构,首先构建最大堆,然后反复将最大元素移动到数组末尾并重建堆。
  • 时间复杂度:O(n log n)(无论是最坏、最好还是平均情况)。
  • 空间复杂度:O(1)(原地排序)。
  • 稳定性:不稳定。

8. 计数排序 (Counting Sort)

  • 描述:适用于已知范围的整数,通过计数每个元素出现的次数来进行排序。
  • 时间复杂度:O(n + k),其中 n 是元素数量,k 是数值范围。
  • 空间复杂度:O(k)(需要额外的存储空间)。
  • 稳定性:稳定。

9. 基数排序 (Radix Sort)

  • 描述:通过多次使用计数排序,按位对整数进行排序,从最低位到最高位。
  • 时间复杂度:O(nk),其中 n 是元素数量,k 是最大数字的位数。
  • 空间复杂度:O(n + k)。
  • 稳定性:稳定。

10. 桶排序 (Bucket Sort)

  • 描述:将元素分到多个桶中,对每个桶内的元素进行排序,然后再合并回原数组。
  • 时间复杂度:O(n + k),其中 n 是元素数量,k 是桶的数量(在某些情况下)。
  • 空间复杂度:O(n + k)。
  • 稳定性:稳定。

总结

不同的排序算法有不同的优缺点,选择合适的排序算法取决于数据的特性(如大小、是否近乎排序等)和具体的应用场景。对于大多数情况,快速排序归并排序 是常用的高效算法,而对于特定情况,如范围有限的整数,计数排序基数排序 可能更合适。

标签:Sort,复杂度,元素,算法,数组,排序
From: https://www.cnblogs.com/love-DanDan/p/18410071

相关文章

  • 查找算法
    查找算法是用于在数据结构中查找特定元素的算法。根据数据的存储方式和组织形式,查找算法可以分为线性查找和二分查找等多种类型。以下是一些常见的查找算法及其特点:1.线性查找(LinearSearch)描述:从数据的第一个元素开始,依次与目标值比较,直到找到目标值或遍历完整个数据。时......
  • 算法与数据结构——二分查找插入点
    二分查找插入点二分查找不仅可用于搜索目标元素,还可以解决许多变种问题,比如搜索目标元素的插入位置。无重复元素情况Question给定一个长度为n的有序数组nums和一个元素target,数组不存在重复元素。现将target插入数组nums中,并保持其有序性。若数组中已存在元素target,则插入到......
  • 密码算法设计与分析 - 课程笔记
    基本概念安全威胁安全威胁被动攻击消息内容获取业务流分析主动攻击中断(可用性)篡改(完整性)伪造(真实性)人为威胁被动攻击被动攻击即窃听,是对系统的保密性进行攻击,如搭线窃听、非法拷贝等,以获取他人的信息。被动攻击分类:消息内容获取:直接对消息内容进行窃听,......
  • 七、常用算法
    文章目录一、二分查找(非递归)二、分治算法2.1分治算法介绍2.2分治算法应用案例三、动态规划算法3.1引出3.2基本介绍3.3应用实例四、KMP算法4.1引出4.2暴力匹配法4.3KMP算法五、贪心算法5.1基本介绍5.2应用实例一、二分查找(非递归)packagecom.gyh.a......
  • 苹果研究人员提出了一种新颖的AI算法来优化字节级表示以自动语音识别(ASR),并将其与UTF
    端到端(E2E)神经网络已成为多语言自动语音识别(ASR)的灵活且准确的模型。然而,随着支持的语言数量增加,尤其是像中文、日语、韩语(CJK)这样大字符集的语言,输出层的大小显著增长。这种扩展对计算资源、内存使用和资产大小产生了负面影响。在多语言系统中,这一挑战尤为严重,因为输出通常包......
  • 算法 - 课程笔记
    调度问题插入排序分治法分治法是将原问题划分为多个规模较小的子问题,这些子问题可以独立求解,将子问题的解进行综合得到原问题的解。算法设计一般使用递归算法,算法分析一般使用递归表达式。归并排序归并排序,就是分组再合并,将一个数组等分为左右两个子数组,然后再使用......
  • 爬楼梯(LeetCode)&冒泡和选择排序
    目录一、爬楼梯(LeetCode)1、题目2、代码二、冒泡排序三、选择排序一、爬楼梯(LeetCode)1、题目2、代码二、冒泡排序三、选择排序......
  • 路径规划 | 基于A*算法的往返式全覆盖路径规划的改进算法(Matlab)
    目录效果一览基本介绍程序设计参考文献效果一览基本介绍基于A*算法的往返式全覆盖路径规划的改进算法matlab实现代码往返式全覆盖路径规划,通过建立二维栅格地图,设置障碍物,以及起始点根据定义往返式路径规划的定义的优先级运动规则从起始点开始进行全图遍历,利用A......
  • 算法题:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第 4
    题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第43个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后5问第一个人,他说是10岁。请问第五个人多大?为了解决这个问题,我们可以使用两种不同的算法思路:递归和迭代。首先,我们......
  • 算法与数据结构——二分查找
    二分查找二分查找(binarysearch)是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。Qustion:给定一个长度为n的数组nums,元素按从小到大的顺序排列且不重复。请查找并返回元素target在该数组中的索引。若数组不包含......