各种排序算法的性能特点

这里只总结各种排序算法的性能特点,不含算法具体的实现

算法 是否稳定 是否为原地排序 时间复杂度 空间复杂度 备注
选择排序 N^2 1
插入排序 介于N和N^2之间 1 取决于输入元素的排列情况
希尔排序 NlogN?N^(6⁄5) 1
快速排序 NlogN lgN 运行效率由概率提供保证
三向快速排序 介于N和NlogN之间 lgN 运行效率由概率保证,同时也取决于输入元素的分布情况
归并排序 NlogN N
堆排序 NlogN 1

这里的稳定的意思是一个排序算法能够保留数组中重复元素的相对位置则可以被称为稳定的。


接下来总结一下各排序算法的性质和优劣

  • 选择排序
    特点:1.运行时间和输入无关
    2.数据移动是最少的,交换次数和数组的大小是线性关系

  • 插入排序
    特点:1.所需时间取决于输入中元素的初始顺序
    2.对于实际应用中常见的某些类型的非随机数组很有效
    3.交换操作和数组中倒置的数量相同,需要的比较次数大于等于倒置的数量,小于等于倒置的数量加上数组的大小再减一

  • 选择和插入比较
    性质:对于随机排序的无重复主键的数组,插入排序和选择排序的运行时间是平方级别的,两者之比应该是一个较小的常数

  • 希尔排序
    特点:1.与选择和插入相比,希尔排序也可以用于大型数组。它对任意排序(不一定是随机的)的数组表现也很好
    2.比插入和选择排序快很多,并且数组越大,优势越大

  • 归并排序
    特点:1.最吸引人的性质是它能够保证将任意长度为N的数组排序所需时间和NlogN成正比
    2.自顶向下的归并排序应用了分治思想,对于长度为N的任意数组,自顶向下的归并排序最多需要访问数组6NlgN次
    3.自底向上的归并应用了分治思想,先归并微型数组,再成对归并得到的子数组,对于长度为N的任意数组,自底向上的归并排序需要1/2NlgN至NlgN次比较,最多访问数组6NlgN次
    4.当数组长度为2的幂时,自顶向下和自底向上的归并排序所用的比较次数和数组访问次数正好相同,只是顺序不同
    5.自底向上的归并排序比较适合用链表组织的数据

    缺点:所需的额外空间和N成正比

  • 快速排序
    特点:1.应用分治思想的算法,应用最广泛的排序算法,一般应用中比其它排序算法快得多
    2.原地排序,将长度为N的数组排序所需的时间和NlgN成正比,排序的内循环比大多数排序算法都要短
    3.最好情况是每次都正好能将数组对半分

    缺点:1.切分不平衡时程序可能会极为低效
    2.对于小数组,快排比插入排序慢

    改进:三向切分的快速排序
    特点:1.三向切分的快速排序的运行时间和输入的信息量的N倍是成正比的。
    2.包含大量重复元素的数组,它将排序时间从线性对数降低到线性级别(最佳算法选择,需要将包含大量重复元素的数组排序)

  • 堆排序
    特点:1.能实现对数级别的插入元素和删除最大元素的操作
    2.使用有序或是无序数组(无序实现的优先队列相当于选择排序)的优先队列的初级实现总是需要线性时间来完成其中一种操作,但基于堆的实现则能够保证在对数时间内完成
    3.用下沉操作由N个元素构造堆只需少于2N次比较以及少于N次交换
    4.堆提供一种从未排序部分找到最大元素的有效方法
    5.唯一能够同时最优地利用空间和时间的方法-最坏情况下也能保证使用~2NlgN次比较和恒定的额外空间

    缺点:很少使用,因为无法利用缓存,数组元素很少和相邻的其他元素进行比较,因此缓存未命中的次数要远高于大多数比较都在相邻元素间进行的算法,如快排、归并、希尔。

你可能感兴趣的:(算法,算法,排序算法,Java,算法性能特点)