代码改变世界

排序算法总结

2012-12-03 08:43  左眼微笑右眼泪  阅读(332)  评论(0编辑  收藏  举报

      到目前为止,已经学习了十种不同的排序算法,它们各自为各自的优缺点,也有各自的适用环境,下面就来总结一些这些算法。

     选择排序是拿一个数与其他的数进行比较,找到其他数中最小的一个数,然后把这个数与其他数中最小的一个数进行交换,依次循环。从这个过程中我们可以知道它的时间复杂度为O(N2),最好和最坏的情况都是这么多,而且它是一种稳定的排序算法。

     冒泡排序是把相邻的两个数进行比较,如果后面一个比前面的小,那么就交换它们的位置,依次循环。冒泡排序的时间复杂度为O(N2),在最好的情况下,也就是待排序列有序的情况下,使用改进的冒泡排序算法,时间复杂度可为O(N)。冒泡排序也是一种稳定的排序方法。

     插入排序,每次在插入时,先把这个数与要插入位置前面的数进行比较,如果比它大,那么直接插入到当前位置,如果比它小,那么把这个数与前面的数一直比较,直到找到一个比它小的数,把当前数插入到比它小的数的后面。插入排序时间复杂度为O(N2),最好情况为O(N),它也是一种稳定的排序算法。

     希尔排序是一种改进的插入排序,它是跳跃形式的,所以它是不稳定的排序,它的时间复杂度最好的情况是O(LogN1.3)。

     堆排序是利用堆这个数据结构来进行排序的,每次移走堆顶的元素,然后再把剩下的元素构建成一个堆,这样一直循环,直到最后一个元素为止。堆排序的时间复杂度是O(NLongN),最好与最坏的情况都是这样。堆排序是一种不稳定的排序算法。

     归并排序是把有序的序列进行两两归并,把归并后的又当作另外一个序列,与其他的序列进行归并。归并排序的时间复杂度是O(NLongN),最好情况与最坏情况都是这样的。它是一种稳定的排序算法。

     快速排序每次都需要找一个枢纽,然后调整数组的顺序,让枢纽左边的数都比它小,右边的数都比它大,然后再把左边及右边的序列又单独做为一个数组,还是按照这个方式进行调整,直到最后。快速排序的时间复杂度最好的时候为O(NLongN),最坏的时候为O(N2),它是一种不稳定的排序。

     基数排序是一种“收集—分配”的算法,它的时候复杂度是O(d(n+m)),具体来说就是一次分配需要时间为O(n),一次收集时间为O(m),共进行d次分配与收集。(n为排序的个数,m为桶的个数,d为排序数中的最高位数)

     桶排序与基数排序类似,但是它只分配一次,然后对每个桶采取别的方法进行排序。

     计数排序是一种线性排序,它的时间复杂度为O(N),它比较适合为数量比较少的数组进行排序。