排序算法的稳定性和内存占用,时间复杂度,空间复杂度讨论

来源:互联网 发布:91游戏代练网站源码 编辑:程序博客网 时间:2024/05/07 11:03

排序算法的稳定性讨论

为什么要提出稳定性这个概念?因为在实际中我们一般是按记录中的某个关键值对一组记录进行排序,比如说某组记录含有身高,体重,年龄三个量,然后我们需要对其按年龄进行排序。这时我们希望如果关键值相等的时候,先输入的数据应该还是排在前面,而不是随便排。那么前面我们学习的排序算法那些是稳定的,那些是不稳定的呢?
我们先给出一个总的结论,然后再来依次简要说明一下:
稳定的排序算法有: 插入排序,合并排序,计数排序,基数排序。
不稳定的排序算法有:堆排序,快速排序。

1.插入排序
对于插入排序,相同的元素在前面插入的也总是排在前面,所以肯定是稳定的

2.合并排序
对于合并排序,我们重点分析它的合并过程;在合并左右过程只要我们保证在比较的时候如果两个元素大小相同,我们就把坐标小的放到前面就可以保证算法是稳定的了。

3.堆排序
无论是建堆还是堆排序的过程都是不断调整的过程,考虑节点i ,和i+1有相同的子节点,然后某次调整的时候节点i+1的子节点往上调整了而i的子节点没有调整;这种情况说明堆排序是不稳定的。

4.快速排序
快排的交换发生在划分的时候,有一种不稳定的情况就是把关键元素(key)交换到中间时会使得它和后面一段元素的相对顺序被打乱;所以快排也是不稳定的

5.计数排序
计数排序最后确定每个数的位置时,是从后往前确定的,所以可以保证相同的元素,原来在后面的排序以后还是在后面;所以计数排序是稳定的。

6.基数排序
如果基数排序在按每一位进行排序时选择的是一个稳定的排序方法,那么它也是稳定的。

排序算法占用内存的讨论

In-place sort(不占用额外内存或占用常数的内存):插入排序、选择排序、冒泡排序、堆排序、快速排序。

Out-place sort:归并排序、计数排序、基数排序、桶排序。

当需要对大量数据进行排序时,In-place sort就显示出优点,因为只需要占用常数的内存。
设想一下,如果要对10000个数据排序,如果使用了Out-place sort,则假设需要用200G的额外空间,则一台老式电脑会吃不消,但是如果使用In-place sort,则不需要花费额外内存。

时间复杂度讨论和空间复杂度

再附一张排序算法时间复杂度比较图,笔试题里会经常碰到,今年阿里的实习面试题中就有一道关于最坏情况下时间复杂度为O(n*logn)的排序算法是?单选题的形式。
这里写图片描述

0 0
原创粉丝点击