您的位置:首页 > 编程语言 > Java开发

各种排序实现及比较(Java)

2016-08-06 18:50 267 查看
排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。

内排序有可以分为以下几类:

插入排序:直接插入排序、二分法插入排序、希尔排序。插入排序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)不稳定
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: