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

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

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

    1. 插入排序:直接插入排序、二分法插入排序、希尔排序。插入排序Java实现
    2. 选择排序:简单选择排序、堆排序。选择排序Java实现
    3. 交换排序:冒泡排序、快速排序。交换排序Java实现
    4. 归并排序:归并排序Java实现
    5. 基数排序
  • 原理:

    • 直接插入排序:
      • 分有序区与无序区,每次从无序区中选取一个元素向有序区中插入。
    • 希尔排序:
      • 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)不稳定
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值