常见的排序算法有哪些?

野性酷女 2023-10-12 21:14 86阅读 0赞

常见的排序算法

    1. 基本概念
    1. 冒泡排序(Bubble sort)
    • 改进方案
      • 改进1:双向扫描
      • 改进2:结束条件
    • 效率分析
    1. 快速排序(Quick Sort)
    1. 直接插入排序(straight insertion sort)
    1. 希尔排序(Shell sort)
    1. 简单选择排序
    1. 归并排序
    1. 基数排序
    1. 排序算法的评价指标
    1. 常见排序算法的复杂度对比

1. 基本概念

排序:是指将一个无序序列整理成按值递增(或递减)的有序序列。

排序法分类
交换类:借助数据元素之间交换位置进行排序。(冒泡排序、快速排序)
插入类:将待排序序列的数据元素依次插入到已排序序列的适当位置。(直接插入排序、希尔排序)
选择类:从无序表中选出最小的元素,把它交换到表的最前面;然后对剩下的子表采用相同的方法,直到子表为空为止。(简单选择排序)
其他方法:归并排序、基数排序

2. 冒泡排序(Bubble sort)

基本思想:逐个交换次序不当的相邻表项,多趟扫描后得到有序表。
特点:冒泡排序也可称为简单交换排序,原理简单。

改进方案

改进1:双向扫描

鸡尾酒搅拌排序,先从左往右扫描,把最大值移到右边,然后再从右往左扫描,把最小值移到左边。

改进2:结束条件

如果一次扫描中没有发生交换,即可结束。

效率分析

假设线性表长度为n,则在最坏情况下,冒泡排序需要经过n/2遍从前往后的扫描以及n/2遍从后往前的扫描,需要的比较次数为n(n-1)/2,所以时间复杂度为O(n^2)。

一般情况下要小于这个工作量。

对于基本有序的序列,效率较高。

3. 快速排序(Quick Sort)

基本思想:从表中任意选取一个元素(一般取第一个、最后一个或中间一个),把它放在排序表中它应该在的位置把原表分为两个子表(子表不一定有序),然后对子表重复以上操作,直至子表长度为1

特点:快速排序也属于交换排序,通常比其他排序方法都属于递归排序,需要较大内存。
在这里插入图片描述
快速排序过程演示(选取最后一个元素作为支点)

支点数据对性能影响很大最佳情况为每次取到中间值,最差情况为每次取到最大或最小值,因此对近乎有序的输入序列效果最差)。

平均时间性能最好,最差时相当于冒泡排序。

4. 直接插入排序(straight insertion sort)

基本思想:每步将一个待排序序列的元素按其关键字的大小插入到已经排好序的序列中的适当位置,直到全部记录插入完毕为止。

改进:插入时,可用二分查找法寻找合适位置,称为“二分查找排序”。

5. 希尔排序(Shell sort)

是对直接插入排序算法的改进,因Donald Shell于1959年提出而得名。

基本思想:将整个无序序列分隔成若干小的子序列

分隔方法

  1. 将相隔某个增量h的元素构成一个子序列。
  2. 在排序过程中,逐次减小这个增量,最后当h减到1时,进行一次插入排序,排序就完成。
  3. 增量序列一般取hk = [n/2^k],(k=1, 2, …, [log2n]) 其中n为待排序序列的长度。
  4. 例如,n=12时,hk=6,3,1。
  5. 增量序列的选取没有确定的最佳方法

例如,n=12时,hk=6,3,1。

一开始步长较大,这样可以让一个元素可以一次性地朝最终位置前进一大步。

算法的最后一步就是普通的插入排序,此时逆序较少,插入排序较快

6. 简单选择排序

基本思想:从无序表中选出最小的元素,把它交换到表的最前面,然后对剩下的子表采用相同的方法,直到子表空为止。对于长度为n的序列,选择排序需要扫描n-1遍。

7. 归并排序

在这里插入图片描述

8. 基数排序

  1. 桶排序(Bucket Sort):原理很简单,它是将数组分到有限数量的桶里。
  2. 基数排序(Radix Sort):是桶排序的扩展,它的基本思想是将整数按位数切割成不同的数字,然后后按每个位数分别比较
  3. 举例:理顺一副牌的过程
    1)如果有N(N<=13)张牌,乱序,如何理顺呢?
    2)假想桌上有13个位置,然后我们将手里的牌一张一张放出去,如果是3,就放在位置3上,如果是J,就放在位置11上,放完了之后从位置1到位置13收集所有的牌(没有牌的位置上不收集)。

9. 排序算法的评价指标

  1. 时间复杂度
  2. 空间复杂度
  3. 稳定性(对相同键码元素之间相对位置维持
  4. 算法简单
  5. 待排序记录个数n的大小
  6. 记录本身信息量的大小
  7. 键码(Key Value)的分布情况

10. 常见排序算法的复杂度对比

在这里插入图片描述
快堆希不稳定,快速排序是比较好的,冒泡排序是比较容易编程的。

参考资料:常见的排序算法有哪些?

发表评论

表情:
评论列表 (有 0 条评论,86人围观)

还没有评论,来说两句吧...

相关阅读

    相关 常见java限流算法哪些

    这篇文章主要讲解了“常见的java限流算法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“常见的java限流算法有哪些”吧