10种常用排序算法简介

news/2024/12/22 21:36:16/

常用排序算法

冒泡排序(Bubble Sort)

选择排序(Selection Sort)

插入排序(Insertion Sort)

希尔排序(Shell Sort)

归并排序(Merge Sort)

快速排序(Quick Sort)

堆排序(Heap Sort)

计数排序(Counting Sort)

桶排序(Bucket Sort)

基数排序(Radix Sort)

算法简介

接下来本文将从算法基本实现思路,时间复杂度,空间复杂度,使用情况来对10种算法一一介绍

  1. 冒泡排序(Bubble Sort):

    • 思路:依次比较相邻的元素,如果它们的顺序错误就交换位置,重复这个过程直到没有任何交换发生。
    • 时间复杂度:平均情况和最坏情况下都为O(n^2)。
    • 空间复杂度:O(1)。
    • 使用情况:适用于小型数据集的排序,效率较低,不建议用于大规模数据排序。
  2. 选择排序(Selection Sort):

    • 思路:每次从未排序的部分选择最小(或最大)的元素放到已排序部分的末尾。
    • 时间复杂度:平均情况和最坏情况下都为O(n^2)。
    • 空间复杂度:O(1)。
    • 使用情况:不稳定排序算法,适用于简单实现且不占用额外空间的情况。
  3. 插入排序(Insertion Sort):

    • 思路:将待排序的元素插入到已经排序的数组中的合适位置。
    • 时间复杂度:平均情况和最坏情况下都为O(n^2)。
    • 空间复杂度:O(1)。
    • 使用情况:适用于小型数据集或基本有序的数据集。
  4. 希尔排序(Shell Sort):

    • 思路:插入排序的改进版,通过设定一个间隔序列来进行插入排序,最终达到完全排序。
    • 时间复杂度:取决于间隔序列的选择,一般为O(n log^2 n)。
    • 空间复杂度:O(1)。
    • 使用情况:适用于中等规模的数据集,对大规模数据也有较好的表现。
  5. 归并排序(Merge Sort):

    • 思路:采用分治法,将数组分成两半分别排序,然后合并两个有序的子数组。
    • 时间复杂度:平均和最坏情况下都为O(n log n)。
    • 空间复杂度:O(n)。
    • 使用情况:稳定排序算法,适用于大规模数据集的排序。
  6. 快速排序(Quick Sort):

    • 思路:选取一个基准值,将小于基准值的放在左边,大于基准值的放在右边,然后递归处理左右两边。
    • 时间复杂度:平均情况下为O(n log n),最坏情况下为O(n^2)。
    • 空间复杂度:取决于递归的深度,在最坏情况下为O(n)。
    • 使用情况:常用的高效排序算法,对大规模数据表现良好。
  7. 堆排序(Heap Sort):

    • 思路:利用堆的性质进行排序,首先构建最大堆或最小堆,然后不断取出堆顶元素调整堆。
    • 时间复杂度:平均和最坏情况下都为O(n log n)。
    • 空间复杂度:O(1)。
    • 使用情况:不稳定排序算法,适用于需要原地排序的情况。
  8. 计数排序(Counting Sort):

    • 思路:统计数组中每个元素出现的次数,然后根据统计信息将元素放回数组。
    • 时间复杂度:O(n + k),其中k为最大元素的范围。
    • 空间复杂度:O(k)。
    • 使用情况:适用于元素范围不是很大的情况。
  9. 桶排序(Bucket Sort):

    • 思路:将元素分散到多个桶中,然后对每个桶中的元素进行排序,最后合并所有桶。
    • 时间复杂度:取决于桶的数量和每个桶内排序所用的算法。
    • 空间复杂度:O(n + k),k为桶的数量。
    • 使用情况:适用于元素均匀分布在范围内的情况。
  10. 基数排序(Radix Sort):

    • 思路:按照数字的位数从低位到高位依次进行排序,通常使用稳定的排序算法作为子排序。
    • 时间复杂度:O(d*(n+k)),其中d为数字的位数,k为基数。
    • 空间复杂度:O(n + k)。
    • 使用情况:适用于整数数据的排序,位数较少且范围不是很大的情况。

各算法特点

  • 简单排序算法:冒泡排序、选择排序、插入排序适用于小型数据集,实现简单但效率较低。

  • 改进型排序算法:希尔排序通过设置间隔序列进行插入排序,适用于中等规模数据集。

  • 分治法排序:归并排序和快速排序适用于大规模数据集,归并排序稳定且时间复杂度为O(n log n),快速排序常用且高效。

  • 堆排序:利用堆的性质进行排序,适用于需要原地排序的情况。

  • 计数排序桶排序基数排序:适用于特定范围或特定类型数据的排序,具有线性时间复杂度。

最后希望本文章能带大家初步了解各排序算法,感谢阅读


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

相关文章

第五章 JVM

什么是 JVM? 1. JVM 是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。 2. JVM 包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。 3. J…

opencv各个模块介绍(2)

Features2D 模块:特征检测和描述子计算模块,包括SIFT、SURF等算法。 Features2D 模块提供了许多用于特征检测和描述子匹配的函数和类,这些函数和类可用于图像特征的提取、匹配和跟踪。 FeatureDetector:特征检测器的基类&#xf…

图论基础|695. 岛屿的最大面积、1020. 飞地的数量、130. 被围绕的区域

695. 岛屿的最大面积 力扣题目链接(opens new window) 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff0…

NPM 国内镜像

一、修改成腾讯云镜像源 1. 设置命令 npm config set registry http://mirrors.cloud.tencent.com/npm/ 验证命令 npm config get registry 如果返回 http://mirrors.cloud.tencent.com/npm/,说明镜像配置成功。 二、修改成淘宝镜像源 设置命令 npm config set…

leetcode26-Remove Duplicates from Sorted Array

这道题目一开始的思路是用了map的方式,并且是有序的map用来保证元素是有序且唯一的,然后map的size就是个数,跑下来发现时间复杂度非常的高,所以一定有更简单的办法。其实数组的考点无非就是遍历,遍历的方式要么就是普通…

vulhub中Apache Shiro 1.2.4反序列化漏洞复现(CVE-2016-4437)

Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。 Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的…

分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测

分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测 目录 分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测分类效果基本介绍模型描述程序设计参…

php搭建websocket

1.项目终端执行命令:composer require topthink/think-worker 2.0.x 2.config多出三个配置文件: 3.当使用php think worker:gateway命令时,提示不支持Windows。 4.打包项目为zip格式 5.打包数据库 6.阿里云创建记录 7.宝塔面板新增站点…