排序算法(一):概述

排序算法(一):概述

排序是程序开发中一种非常常见的操作,对一组任意的数据元素(或记录)经过排序操作后,就可以把他们变成一组按关键字排序的有序队列。

对于排序算法从以下几点去衡量算法的优劣:

  1. 时间复杂度,所谓时间复杂度就是将一组数从无序到有序所花费的时间,通常使用一个量级去衡量,比如O(n) 或者 O(n*n)
  2. 空间复杂度,所谓空间复杂度就是在排序过程中使用辅助空间的大小,通常也是使用一个量级去衡量,比如O(n) 或者 O(n*n)
  3. 是否稳定,所谓排序算法是否稳定的定义是对于相等的两个元素,在排序之后元素的位置是否互换,比如一个数组array array[i]与array[j]相等且(i<j),如果排序后array[i]与array[j]相互交换,我们则说这个排序是不稳定的,否则是稳定的。

对于排序算法的分类:

  1. 内部排序,所谓内部排序就是整个排序过程中都是在内存中,无需借助磁盘就可以完成排序,即为内部排序
  2. 外部排序,所谓外部排序就是数据量比较大,无法一次性将数据载入内存,需要内存与磁盘的多次数据交换才能完成的排序,即为外部排序

外部排序:

  1. 多路归并排序
  2. 败者树

内部排序:

  1. 插入排序:直接插入排序,希尔排序
  2. 选择排序:简单选择排序,堆排序
  3. 交换排序:冒泡排序,快速排序
  4. 归并排序
  5. 基数排序
  6. 桶排序
  7. 计数排序

排序算法整体印象图(来自网络截图),我们先对整体的排序算法一个概括,后续会详细的一一介绍

算法种类 排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 是否稳定
插入排序 直接插入排序算法  O(n2)  O(n)   O(n2)  O(1)  稳定
希尔排序算法  O(nlogn)  O(nlogn2)   O(nlogn2)  O(1) 不稳定 
选择排序 简单选择排序算法  O(n2)  O(n2)  O(n2)  O(1)  不稳定
堆排序  O(nlogn)  O(nlogn)  O(nlogn)  O(1)  不稳定 
交换排序 冒泡排序算法  O(n2)  O(n)   O(n2)  O(1)/无需  稳定
快速排序算法   O(nlogn)   O(nlogn)  O(n2)  O(logn)  不稳定
-- 归并排序算法  O(nlogn)  O(nlogn) O(nlogn)   O(n)  稳定
-- 基数排序算法  O(n*k)  O(n*k) O(n+k)   O(k)  稳定
-- 桶排序算法  O(n+k)   O(n+k)  O(n2  O(n+k)   稳定
-- 计数排序算法  O(n+k)   O(n+k)   O(n+k)   O(k)  稳定 

 

欢迎大家一块探讨

posted @ 2017-09-27 14:15  房杰  阅读(121)  评论(0编辑  收藏  举报