数据结构-排序总结(冒泡 插入 选择 归并)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cyzyfs/article/details/78155757

在我们看到,无论是冒泡排序,插入排序或者是选择排序,时间复杂度都可能是是O(N^2).

为什么这三种排序时间复杂度都有可能是N^2而二路归并是O(NLog(N))?
让我们先看看前三种排序方法:

  • 冒泡排序:通过比较,将较大(较小)的向后移动
  • 选择排序:通过比较,将前面的与后面最大(最小)的交换位置
  • 插入排序:通过比较,将后面较大的挨个与前面做比较,符合条件的移动位置

    相应的时间复杂度:

  • 冒泡排序:O(N^2)
  • 选择排序:O(N^2)
  • 插入排序:最好情况:O(N)最坏情况:O(N^2)

通过以上排序方式,我们都不难发现,这些排序其实是在做两种事情,一个是比较,一个是按照比较的结果做出位置的变换.其中位置的变换是限制在一个数的范围内的,也就是说,每次比较,结果的信息都影响到一个数的变换,或者是交换位置,或者是往前往后移动.
两个数比较,对位置操作只保留一个数的比较信息,这样就会丢失另一个比较数的信息.
而二路归并很好的解决了这个问题.
这里写图片描述
假设,我们对8个数进行排序,一个蓝色方格代表一个数,方格上的斜线表示从小到大排序后结果.
一共进行3(log2(8)=3)个大次排序
每个大次内部又有N次比较和交换,并且比较的两个数的结果都已位置方式保留了下来,这样在以后的排序中,两个数保存的顺序作为后面排序的参考,这样减少了一部分比较次数.
因此归并排序时间复杂度为O(N*log2(N))
归并排序,不足之处在于他的空间复杂度为O(N),这个不难理解,N个元素排序,需要开辟一块N个长度的内存空间,这样在排列众多数的时候,对存储的空间要求就很多了.而冒泡排序,插入排序,选择排序,空间复杂度为O(1),他们只有了几个内存空间保存当前比较结果,所以就少了很多空间.因此,在实际情况中,要注意选择适合的排序方法.

猜你喜欢

转载自blog.csdn.net/cyzyfs/article/details/78155757