各个排序算法的时间复杂度、稳定性、快排的原理以及图解

一、数据结构的八大排序算法总结笔记:

1、常见的数据结构排序算法如下图所示:

2、常见数据结构排序算法的时间复杂度、空间复杂度、稳定性介绍如下图所示:

二、排序算法逐一介绍:

1、直接插入排序:

(1)排序原理及方法:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果新元素小于已排序元素tmp<array[ j ],将该元素移到下一位置array[ j+1]=array[ j ]
  4. 重复步骤3 j - -,直到找到已排序的元素小于或者等于新元素的位置 array[ j ]<=tmp
  5. 将新元素tmp插入到该位置  array[ j+1] = tmp
  6. 重复步骤2~5

(2)排序方法图解: 

(3)算法效率:

平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度稳定性
O(N^2)O(N) O(N^2) O(1) 稳定
  • 平均时间复杂度:O(N^2)   两个for循环嵌套
  • 最好时间复杂度:O(N)   有序时,j不需要回退,只剩下一个for循环

 2、希尔排序

(1)排序原理及方法:

  1. 第一趟增量序列为5,把待排序列分割为5个的子序列(第一个子序列从第一个元素开始,相隔5个元素,取下一个元素,直到取不够5个间隔的元素为止),其中每个子序列包含2个元素,分别对这5个子序列进行直接插入排序。
  2. 第二趟增量序列为2,把待排序列分割为2个的子序列(第一个子序列从第一个元素开始,相隔2个元素,取下一个元素,直到取不够2个间隔的元素为止),其中每个子序列包含5个元素,分别对这2个子序列进行直接插入排序。
  3. 最后一趟增量序列为1,待排序列整体进行直接插入排序,最后一趟数据已经基本有序,效率很高。

(2)排序方法图解:  

(3)算法效率:

平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度稳定性
O(nlogn)O(n^1.3)O(n^2) O(1) 不稳定

3、简单选择排序

(1)排序原理及方法:

从待排序列中第一个元素(i=0)开始,与下一个元素(j=i+1)进行比较,如果比第二个元素小,则交换位置,直到 j 向后走到数组最后一个元素,开始第二趟排序,这样就确定了最小的元素
第二趟排序从第二个元素(i=1)开始,与下一个元素(j=i+1)进行比较,如果比第二个元素小,则交换位置,这样就确定了数组中第二小的元素
以此类推,每一趟排序可以确定一个元素的位置,即最小的元素,第二小元素,第三小元素..... 

(2)排序方法图解:   

 

(3)算法效率: 

平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度稳定性
O(N^2)O(N^2)O(N^2) O(1) 不稳定
  • 最坏时间复杂度:O(N^2)  无论是否有序,都必须进行两层for循环进行比较

4、冒泡排序

(1)排序原理及方法:

第一趟从第一个元素array[0]开始,与下一个元素array[1]进行比较,如果array[1]小于array[ 0],则交换位置,然后比较array[1]和array[ 2],如果array[1]小于array[ 2],则交换位置,以此类推,直到比较完全部元素,就确定了最大元素
第二趟从第一个元素array[0]开始,与下一个元素array[1]进行比较,依次两组元素进行比较,直到比较完除了最后一个元素的全部元素,这样就确定了第二大元素
每一趟比较结束,就依次确定了最大元素,第二大元素,第三大元素...

(2)排序方法图解:   

(3)算法效率: 

平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度稳定性
O(N^2)O(N) O(N^2) O(1) 稳定
  • ​​​最好时间复杂度:O(N)   数据有序的情况下,不需要交换数据,即内部for循环复杂度为O(1)

5、快速排序

(1)排序原理及方法:

从数列中挑出一个元素,称为"基准"(pivot)。
重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。

(2)排序方法图解:   

 

(3)算法效率: 

平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度稳定性
O(nlogn)O(nlogn) O(N^2)O(logn)~ O(n) 不稳定

最好时间复杂度:当每次划分时,算法若都能分成两个等长的子序列时,分治算法效率达到最大

最坏时间复杂度:待排序列有序时,相当于冒泡排序,递归实现会出现栈溢出的现象,时间复杂度为O(N^2)

最好空间复杂度:每次都把待排序列分为相等的两部分,2^x=n (分割x次,保存x个par) ,x = logn

最坏空间复杂度:1 2 3 4 5 6 7   N个数据就保存N个par

6、归并排序

(1)排序原理及方法:

  • 把待排序列递归的分为长度相等的两个子序列,直到分解为1个子序列中包含1个元素为止
  • 递归的将每两个子序列合并为一个有序子序列
  • 最终合并的序列即为有序序列

(2)排序方法图解:   

 

(3)算法效率: 

平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度        稳定性
O(nlogn)O(nlogn) O(nlogn) O(n)稳定

7、堆排序

(1)排序原理及方法:

  • 将待排序序列构造成一个大顶堆
  • 此时,整个序列的最大值就是堆顶的根节点。
  • 将其与末尾元素进行交换,此时末尾就为最大值。
  • 然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。
  • 可以看到在构建大顶堆的过程中,元素的个数逐渐减少,最后就得到一个有序序列了.

(2)排序方法图解:   

 

(3)算法效率: 

堆排序

堆排序

O(n*logn)

不稳定

8、基数排序

(1)排序原理及方法:

将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,
数列就变成一个有序序列。

(2)排序方法图解:  

 

 

(3)算法效率: 

平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度        稳定性

基数排序是经典的空间换时间的排序方法,当数据量过大时,容易造成内存溢出

  • 4
    点赞
  • 15
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

小白~夏秋~

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值