各种排序算法(动图)

#排序算法总览

桶排序和基数排序太废了不展示。

排序算法平均时间复杂度最佳情况最坏情况空间复杂度稳定性排序的对象
冒泡排序O(n^2)O(n)O(n^2)O(1)Yes数组
选择排序O(n^2)O(n)O(n^2)O(1)No数组、链表(链表稳定)
插入排序O(n^2)O(n)O(n^2)O(1)Yes数组、链表
希尔排序O(n^1.3)O(n)O(n^1.3)O(1)No数组
归并排序O(n*logn)O(n*logn)O(n*logn)O(n)Yes数组、链表
快速排序O(n*logn)O(n^logn)O(n^2)O(n*logn)No数组
堆排序O(n*logn)O(n*logn)O(n*logn)O(1)No数组
计数排序O(n+k)O(n+k)O(n+k)O(k)Yes数组、链表

#冒泡排序

1、从数组的第一个数开始,每个数与它后面的数比较,直到排序末尾

2、若后面的数比较小,则交换两个数。

3、将最后一次比较的后一个数作为排序末尾

3、若执行过2的交换,则回到步骤1,否则结束。

图片出处:冒泡排序与选择排序(方法+动画+算法十大排序分类图)_选择排序和冒泡排序-CSDN博客

#选择排序

0、先选择数组开始的位置的数为“排序开始的位置”

1、让“排序开始的位置”的数为key,然后让key依次与后面的其他数依次进行比较。

2、若有值比key小,那让key等于较小的值。

3、比较完最后一个数后,将数组“排序的开始位置”的数和key交换。

4、若“排序开始的位置”不为数组末尾。将“排序开始的位置”往后移动一位,然后回到步骤1。

                  

图片出处:动画:一篇文章快速学会选择排序_javabianc-CSDN博客

 #插入排序

0、让数组中第一个数作为key。

1、让key与它前面的数依次比较。

2、遇到比key大的数,让较大的数向后移动一位。遇到比key小的数,将key插入到较小的数的后一位。

3、直到数组的所有数全成为过key之前。重新选取下一个数为key,然后回到步骤1。

图片出处:数据结构-插入排序(直接插入排序+折半插入排序)_编写一个程序,分别用直接插入排序和折半插入排序实现对线性表中数据元素的排-CSDN博客

# 希尔排序

1、将数组中的元素"分组",每组中,每个元素之间相隔gap-1个元素。

2、对每个组进行插入排序,全部进行插入排序后,让gap=gap/3+1(图中是/2)。

3、若未执行过gap=1。则回到步骤1。

图片出处:【排序】经典排序算法动画详解----希尔排序C语言实现_希尔排序c语言代码-CSDN博客

 #归并排序

0、创建一个临时数组temp。

1、将“需排序的数组”分成两半(前一半数组a和后一半数组b):

(数组中只有一个元素时,那它就一定是有序的)

  (1)若a,b都有序,则将a中第一个数a1与b中所有数依次比较:

        *若a1小于b1,则将a1放到temp中,然后a2与b1比,依次类推。

        *若a1大于b1,则将b1放到temp中,然后a1与b2比,依次类推。

        *若a(或b)数组的元素再比较完成后有剩余,则让a(或b)数组剩余的元素依次放入temp中。

        *当a,b的元素全放入temp后,temp将这些元素按照对应的位置返回给原数组。

   (2)若a,b中有无序的,让无序的部分称为“需排序的数组”执行步骤1。

   

图片出处:c++算法全套流水账——排序-CSDN博客

# 快速排序

找半天了动图,就没有霍尔和挖坑法的好动图,指针法的动图更是垃圾。

所以我找了个视频,里面是挖坑法,好理解:三分钟学会快速排序_哔哩哔哩_bilibili

步骤逻辑:

1、将数组第一个数定为key。

2、创建L指针指向key,创建指针R指向数组末尾,key所在位置标记为hole。

3、R向左移动,找到比key小的数,R覆盖hole,R标记为hole。

4、L向右移动,找到比key大的数,L覆盖hole,L标记为hole。

5、若L和R未相遇,则回到步骤2。若相遇,将key放入相遇点,以相遇点为分割点,视为将数组分为两个子数组a,b(a,b均不含分割点)。

6、若a,b有元素不为0的数组,则让元素不为0的数组执行1。

#堆排序

1、将数组建成大堆

2、删除堆顶元素,向下调整

3、若堆不为空,则回到步骤2。

图片出处:小白学排序 | 十大经典排序算法(动图)-轻识

#计数排序

0、找出需排序数组的最大值max和最小值mini,创建大小为max-mini+1的临时数组temp,让temp中的元素值都为0,待排位置待排序数组的第一个位置。

1、依次检测数组中的元素,让temp[检测到的元素-mini]的值+1。

2、寻找temp中不为0的元素:

 若找到:

        *将temp中(不为0的元素的下标+mini)放到待排序数组待排位置

        *待排位置向后移动一位

        *若元素值不为0,将元素值-1,回到(1)。否则回到2步骤。

        

图片出处:https://blog.csdn.net/k1234hxh/article/details/134631590

  • 38
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值