常见排序算法(零)(各类排序算法总结与比较)
2016-09-25 12:49
253 查看
相关文章:
常见排序算法(零)(各类排序算法总结与比较)
常见排序算法(一)(冒泡排序、插入排序)
常见排序算法(二)(选择排序)
常见排序算法(三)(快速排序、归并排序、计数排序)
常见排序算法(四)(基数排序、桶排序)
常见的排序算法有以下几种:冒泡排序(BubbleSort)、选择排序(Selection Sort)、插入排序(Insertion Sort)、快速排序(Quick Sort)、归并排序(Merge Sort)、计数排序(Counting Sort)、基数排序(Radix Sort)、桶排序(Bucket Sort)。每种排序的时间复杂度和空间复杂度,所适用的数据集,具体适用的情况会有所不同,先通过一个表来认识这几种排序:
计数排序中n指的是关键字的个数,k指的是最大关键字与最小关键字的差值。
基数排序中r代表关键字的基数,d代表最大数据的长度,n代表关键字的个数。
*希尔排序的平均时间复杂度取决于增量的选取
**桶排序的最差时间复杂度取决于桶中的排序算法
***桶排序的稳定性取决于桶中的排序算法
最简单的排序是冒泡排序,插入排序,直接选择排序,这三种排序算法实现简单,逻辑易懂,不涉及递归,不占用多余空间,但是效率较低,平均时间复杂度全部为O(n2),因此在实际运用中很少见。在一些不追求效率,小范围的排序中可以使用这几种排序。
基于比较的排序算法最优时间复杂度为O(nlogn),快速排序,归并排序,堆排序的平均时间复杂度可以达到这个时间复杂度,三者之间相互比较,从空间复杂度看,占用空间最大的是归并排序,需要2n的多余空间,快速排序需要n的多余空间,堆排序不需要多余空间,从这点上看,堆排序要优于其它两种排序算法。并且堆排序在任何情况下的时间复杂度都是O(nlogn),在任何情况下都可以用最短的时间完成排序,比快速排序的时间要稳定,所以理论上是三者中最优的算法。
但堆排序的缺点在于当堆中的一个数据发生改变,整个堆都需要进行调整以维护堆的性质,需要额外的维护开销,由于在实际运用中,数据变动是很频繁的,所以实际上堆排序不是很适合实际的运用。
归并排序虽然占用空间大,但是任何情况下的时间复杂度都为O(nlogn),表现稳定,并且当数据分段有序时,表现会优于快速排序,因此当数据量不大时,可以选择归并排序。
实际运用中快速排序运用最广泛的原因在于,占用空间小,平均时间复杂度低,虽然在最差情况下会达到O(n2),并且在很多数据相等的情况下迭代层次会增加,但在大多数情况下,以上两种情况(逆序,大量数据相等)很少出现,综合考虑下,快速排序是基于比较的排序中较优的一种选择。
不基于比较的排序算法有计数排序和基数排序,这两种排序有天生的缺陷,计数排序只能对整数排序,基数排序只能对自然数排序,大大限制了它们的应用范围。这两种排序中计数排序是明显要优于基数排序的,计数排序占用空间小,大部分情况下时间复杂度比基数排序低。但是计数排序是一种不稳定的排序算法,如果对稳定性有要求的话还是要选择基数排序。有一点要注意的是,基数排序,特别是最高位优先排序,辅助空间大,在数据量较大是可能会造成内存不足。
计数排序和快速排序来比较,个人感觉在待排序数组全为整数,并且最大值与最小值之差不是特别大的时候时,计数排序会优于快速排序,尤其是在相等的数很多的情况下,计数排序表现更佳。
常见排序算法(零)(各类排序算法总结与比较)
常见排序算法(一)(冒泡排序、插入排序)
常见排序算法(二)(选择排序)
常见排序算法(三)(快速排序、归并排序、计数排序)
常见排序算法(四)(基数排序、桶排序)
常见的排序算法有以下几种:冒泡排序(BubbleSort)、选择排序(Selection Sort)、插入排序(Insertion Sort)、快速排序(Quick Sort)、归并排序(Merge Sort)、计数排序(Counting Sort)、基数排序(Radix Sort)、桶排序(Bucket Sort)。每种排序的时间复杂度和空间复杂度,所适用的数据集,具体适用的情况会有所不同,先通过一个表来认识这几种排序:
名称 | 时间复杂度 | 空间复杂度 | 稳定性 | 适用范围 | |||
最优 | 最差 | 平均 | |||||
冒泡 排序 | 直接冒泡排序 | O(n²) | O(n²) | O(n²) | O(1) | 稳定 | 实数 |
改进版冒泡排序 | O(n) | O(n²) | O(n²) | O(1) | 稳定 | 实数 | |
选择 排序 | 直接选择排序 | O(n²) | O(n²) | O(n²) | O(1) | 不稳定 | 实数 |
树形选择排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 | 实数 | |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 | 实数 | |
插入 排序 | 直接插入排序 | O(n) | O(n2) | O(n2) | O(1) | 稳定 | 实数 |
二分插入排序 | O(n) | O(n2) | O(n2) | O(1) | 稳定 | 实数 | |
希尔排序 | O(n) | O(n2) | O(n1.5)* | O(1) | 不稳定 | 实数 | |
快速排序 | O(nlogn) | O(n2) | O(nlogn) | O(n) | 不稳定 | 实数 | |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 | 实数 | |
计数排序 | / | / | O(n + k) | O(n + k) | 不稳定 | 整数 | |
基数 排序 | 最低位优先排序 | O(d(n+ rd)) | O(d(r+ n)) | O(d(n+ rd)) | O(rd+ n) | 稳定 | 自然数 |
最高位优先排序 | |||||||
桶排序 | O(n) | ** | | O(d + n) | *** | 实数 |
基数排序中r代表关键字的基数,d代表最大数据的长度,n代表关键字的个数。
*希尔排序的平均时间复杂度取决于增量的选取
**桶排序的最差时间复杂度取决于桶中的排序算法
***桶排序的稳定性取决于桶中的排序算法
最简单的排序是冒泡排序,插入排序,直接选择排序,这三种排序算法实现简单,逻辑易懂,不涉及递归,不占用多余空间,但是效率较低,平均时间复杂度全部为O(n2),因此在实际运用中很少见。在一些不追求效率,小范围的排序中可以使用这几种排序。
基于比较的排序算法最优时间复杂度为O(nlogn),快速排序,归并排序,堆排序的平均时间复杂度可以达到这个时间复杂度,三者之间相互比较,从空间复杂度看,占用空间最大的是归并排序,需要2n的多余空间,快速排序需要n的多余空间,堆排序不需要多余空间,从这点上看,堆排序要优于其它两种排序算法。并且堆排序在任何情况下的时间复杂度都是O(nlogn),在任何情况下都可以用最短的时间完成排序,比快速排序的时间要稳定,所以理论上是三者中最优的算法。
但堆排序的缺点在于当堆中的一个数据发生改变,整个堆都需要进行调整以维护堆的性质,需要额外的维护开销,由于在实际运用中,数据变动是很频繁的,所以实际上堆排序不是很适合实际的运用。
归并排序虽然占用空间大,但是任何情况下的时间复杂度都为O(nlogn),表现稳定,并且当数据分段有序时,表现会优于快速排序,因此当数据量不大时,可以选择归并排序。
实际运用中快速排序运用最广泛的原因在于,占用空间小,平均时间复杂度低,虽然在最差情况下会达到O(n2),并且在很多数据相等的情况下迭代层次会增加,但在大多数情况下,以上两种情况(逆序,大量数据相等)很少出现,综合考虑下,快速排序是基于比较的排序中较优的一种选择。
不基于比较的排序算法有计数排序和基数排序,这两种排序有天生的缺陷,计数排序只能对整数排序,基数排序只能对自然数排序,大大限制了它们的应用范围。这两种排序中计数排序是明显要优于基数排序的,计数排序占用空间小,大部分情况下时间复杂度比基数排序低。但是计数排序是一种不稳定的排序算法,如果对稳定性有要求的话还是要选择基数排序。有一点要注意的是,基数排序,特别是最高位优先排序,辅助空间大,在数据量较大是可能会造成内存不足。
计数排序和快速排序来比较,个人感觉在待排序数组全为整数,并且最大值与最小值之差不是特别大的时候时,计数排序会优于快速排序,尤其是在相等的数很多的情况下,计数排序表现更佳。
相关文章推荐
- 常见的三种排序算法(堆排、快排、归并排序)的比较总结
- 各类排序算法的比较总结
- 比较常见的排序算法总结
- 常见排序算法的总结与比较
- 常见的排序算法比较及总结
- IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响—O_NONBLOCK(open使用)、IPC_NOWAIT(msgrcv)、MSG_DONTWAIT(re
- 各种常见排序算法的思路(比较)
- 总结了一些常见的排序算法,面试必备啊!<转载>
- 总结了一些常见的排序算法,面试必备啊!
- 常见数据结构查找、插入、删除、遍历性能比较 常见排序算法的比较(图)
- 各种排序算法的总结和比较
- 常见数据结构查找、插入、删除、遍历性能比较 常见排序算法的比较(图)
- IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较
- 各类排序算法总结
- 常见排序算法总结
- 各种排序算法的总结和比较
- 常见排序算法总结
- 常见排序算法总结
- 各类排序算法比较(C++)
- 常见排序算法总结