各种排序实现及比较(Java)
2016-08-06 18:50
267 查看
排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。
内排序有可以分为以下几类:
插入排序:直接插入排序、二分法插入排序、希尔排序。插入排序Java实现
选择排序:简单选择排序、堆排序。选择排序Java实现
交换排序:冒泡排序、快速排序。交换排序Java实现
归并排序:归并排序Java实现
基数排序
原理:
直接插入排序:
分有序区与无序区,每次从无序区中选取一个元素向有序区中插入。
希尔排序:
Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。
简单选择排序:
依次从待排序的记录中选择关键字最小(大)的记录放到最开始的位置。
堆排序:
堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。
最大堆:从根到叶子节点递减。
最小堆:从根节点到叶子节点递增。
堆排序适合于数据量非常大的场合(百万数据)。
堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。
冒泡排序:
对所有相邻的关键字进行比较,如逆序,则交换。
它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。
快速排序:
又称分区交换,选取基准,将序列分在基准的两边。
归并排序:
将两个或两个以上的有序序列合并成一个有序序列。
归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。
基数排序:
又称桶排序,按排序记录的关键字的组成成分或位进行排序。
时间空间复杂度对比:
排序算法是否稳定:如果两个相等的数据元素,排好序之后的相对位置不变则稳定。
内排序有可以分为以下几类:
插入排序:直接插入排序、二分法插入排序、希尔排序。插入排序Java实现
选择排序:简单选择排序、堆排序。选择排序Java实现
交换排序:冒泡排序、快速排序。交换排序Java实现
归并排序:归并排序Java实现
基数排序
原理:
直接插入排序:
分有序区与无序区,每次从无序区中选取一个元素向有序区中插入。
希尔排序:
Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。
简单选择排序:
依次从待排序的记录中选择关键字最小(大)的记录放到最开始的位置。
堆排序:
堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。
最大堆:从根到叶子节点递减。
最小堆:从根节点到叶子节点递增。
堆排序适合于数据量非常大的场合(百万数据)。
堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。
冒泡排序:
对所有相邻的关键字进行比较,如逆序,则交换。
它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。
快速排序:
又称分区交换,选取基准,将序列分在基准的两边。
归并排序:
将两个或两个以上的有序序列合并成一个有序序列。
归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。
基数排序:
又称桶排序,按排序记录的关键字的组成成分或位进行排序。
时间空间复杂度对比:
排序算法是否稳定:如果两个相等的数据元素,排好序之后的相对位置不变则稳定。
排序方法 | 平均时间复杂度 | 最坏时间复杂度 | 辅助空间 | 稳定性 |
---|---|---|---|---|
直接插入排序 | O(n^2) | O(n^2) | O(1) | 稳定 |
简单选择排序 | O(n^2) | O(n^2) | O(1) | 稳定 |
冒泡排序 | O(n^2) | O(n^2) | O(1) | 稳定 |
归并排序 | O(NlogN) | O(NlogN) | O(N) | 稳定 |
基数排序 | O(logRB) | O(logRB) | O(N) | 稳定 |
希尔排序 | O(N^1.3) | O(N^1.3) | O(1) | 不稳定 |
快速排序 | O(NlogN) | O(N^2) | O(NlogN) | 不稳定 |
堆排序 | O(NlogN) | O(NlogN) | O(1) | 不稳定 |
相关文章推荐
- Java各种排序实现 ZT
- Java实现选择排序和冒泡排序执行时间的比较
- Java版的各种Thrift server实现的比较
- 用Java实现各种排序(1)---冒泡排序,直接插入排序,简单选择排序
- java各种算法排序图解以及原码实现
- Java各种排序实现(转)
- 各种排序方法java实现
- Java编程之TreeSet排序两种解决方法(1)元素自身具备比较功能,元素需要实现Comparable接口覆盖compare(2)创建根据自定义Person类的name进行排序的Comparator
- java实现各种排序算法及比较
- Java实现各种排序
- Java 实现各种排序算法并测试排序效率
- java实现各种基础排序
- Java版的各种Thrift server实现的比较
- Java实现的排序算法及比较 [冒泡,选择,插入,归并,希尔,快排]
- 各种排序算法C#实现&比较论文(可以供java程序员参考)
- 120941138:java list sort()排序各种方式,实现接口
- java中各种排序的实现 不断更新
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- java各种排序总结及实现
- java实现各种排序算法及比较