《软件设计师》复习笔记(9.5)——排序算法原理

目录

排序算法总结

1. 直接插入排序

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

3. 简单选择排序

4. 堆排序

5. 冒泡排序

6. 快速排序

7. 归并排序

8. 基数排序

排序算法对比

真题示例:


排序算法总结

(4.1)十大算法排序-CSDN博客https://blog.csdn.net/m0_73631172/article/details/146439122?spm=1011.2415.3001.5331

1. 直接插入排序

  • 思想:将待排序元素插入到已排序序列的合适位置。
  • 步骤
    1. 初始时,第1个元素视为有序序列。
    2. 从第2个元素开始,依次与前面的元素比较,找到合适位置插入。
  • 特点
    • 时间复杂度:O(n²)(最好情况O(n),已有序)。
    • 空间复杂度:O(1)(原地排序)。
    • 稳定排序
  • 适用场景
    • 数据量小或基本有序时效率较高。

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

  • 思想:分组插入排序,逐步缩小增量,最终进行全序列插入排序。
  • 步骤
    1. 选择增量序列(如5, 3, 1)。
    2. 对每个增量分组进行插入排序。
  • 特点
    • 时间复杂度:O(n^(1.3~2))(取决于增量序列)。
    • 空间复杂度:O(1)
    • 不稳定排序
  • 适用场景
    • 适用于大数据量,比直接插入排序更高效。

3. 简单选择排序

  • 思想:每次从未排序部分选出最小元素,放到已排序序列末尾。
  • 步骤
    1. 遍历数组,找到最小值并与第1个元素交换。
    2. 重复上述过程,每次减少一个未排序元素。
  • 特点
    • 时间复杂度:O(n²)(无论是否有序)。
    • 空间复杂度:O(1)
    • 不稳定排序(交换可能破坏顺序)。
  • 适用场景
    • 数据量小,交换次数较少。

4. 堆排序

  • 思想:利用堆结构(大根堆/小根堆)进行排序。
  • 步骤
    1. 建堆:从最后一个非叶子节点调整,形成堆。
    2. 每次取堆顶元素(最大值),与末尾元素交换,调整剩余堆。
  • 特点
    • 时间复杂度:O(nlogn)(建堆O(n),调整O(logn))。
    • 空间复杂度:O(1)
    • 不稳定排序
  • 适用场景
    • 适合大数据量,尤其需要前几名元素时。

5. 冒泡排序

  • 思想:相邻元素比较交换,每一轮将最大元素“冒泡”到末尾。
  • 步骤
    1. 从前往后比较相邻元素,逆序则交换。
    2. 每轮减少一个未排序元素。
  • 特点
    • 时间复杂度:O(n²)(最好情况O(n),已有序)。
    • 空间复杂度:O(1)
    • 稳定排序
  • 适用场景
    • 数据量小或基本有序时。

6. 快速排序

  • 思想:分治法,选取基准元素,将序列分为左右两部分。
  • 步骤
    1. 选择基准(如第一个元素)。
    2. 从右向左找小于基准的元素,从左向右找大于基准的元素,交换。
    3. 递归处理左右子序列。
  • 特点
    • 时间复杂度:平均O(nlogn),最坏O(n²)(已有序时)。
    • 空间复杂度:O(logn)(递归栈)。
    • 不稳定排序
  • 适用场景
    • 大数据量,平均性能最优。

7. 归并排序

  • 思想:分治法,将序列分成子序列排序后合并。
  • 步骤
    1. 递归分解序列至单个元素。
    2. 合并两个有序子序列。
  • 特点
    • 时间复杂度:O(nlogn)
    • 空间复杂度:O(n)(需额外存储空间)。
    • 稳定排序
  • 适用场景
    • 大数据量,需稳定排序时。

8. 基数排序

  • 思想:按关键字(如个位、十位)分桶排序。
  • 步骤
    1. 从低位到高位依次排序。
    2. 每次排序后重新分桶。
  • 特点
    • 时间复杂度:O(d(n+r))(d为关键字位数,r为基数)。
    • 空间复杂度:O(n+r)
    • 稳定排序
  • 适用场景
    • 关键字位数少且数据量大时(如整数排序)。

排序算法对比

排序方法时间复杂度(平均)空间复杂度稳定性适用场景
直接插入排序O(n²)O(1)稳定小数据量或基本有序
希尔排序O(n^(1.3~2))O(1)不稳定大数据量
简单选择排序O(n²)O(1)不稳定数据量小,交换少
堆排序O(nlogn)O(1)不稳定大数据量,找前几名
冒泡排序O(n²)O(1)稳定小数据量或教学示例
快速排序O(nlogn)O(logn)不稳定大数据量,平均性能最优
归并排序O(nlogn)O(n)稳定大数据量,需稳定排序
基数排序O(d(n+r))O(n+r)稳定关键字位数少且数据量大

真题示例:

将数组{1,1,2,4,7,5}从小到大排序,若采用________排序算法,则元素之间需要进行的比较次数最少,共需要进行________次元素之间的比较。
A. 直接插入  B. 归并  C. 堆  D. 快速
A. 5  B. 6  C. 7  D. 8 

直接插入归并快速
比较次数69915

在n个数的数组中确定其第i(1<=i<=n)小的数时,可以采用快速排序算法中的划分思想,对n个元素划分,先确定第k小的数,根据i和k的大小关系,进一步处理,最终得到第i小的数。划分过程中,最佳的基准元素选择的方法是选择待划分数组的( )元素。此时,算法在最坏情况下的时间复杂度为(不考虑所有元素均相等的情况)( )。
A.第一个  B.最后一个  C.中位数  D.随机一个
A.Θ(n)  B.Θ(lgn)  C.Θ(nlgn)  D.Θ(n²)

  1. 基准选择方法
    • 选择中位数理论上最优。
  2. 时间复杂度
    • 最坏情况(如每次选到最差基准)为 Θ(n²)

对N个数排序,最坏情况下时间复杂度最低的算法是( )排序算法
A、插入  B、冒泡  C、归并  D、快速

排序算法最坏时间复杂度
插入排序O(n²)
冒泡排序O(n²)
归并排序O(nlogn)
快速排序O(n²)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值