基本的排序算法

一、基于比较的排序算法

定理1:基于比较的排序,时间复杂度下界为O(nlog2 n).

证明:对于n个排序元素,在没比较时,可能的正确结果有n!种。经过一次比较后,其中两个元素的顺序被确定,所以可能的正确结果剩余n!/2种,依次类推,直到经过m次比较,剩余可能性为n!/(2^m)种,直到小于等于1时,结果只剩一种。此时的比较次数m为O(nlog2 n)次。

1.1 选择排序

算法步骤:

  • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  • 重复第二步,直到所有元素均排序完毕。

选择排序法需要进行n-1次选择,每次选择的时间复杂度为o(n),所以选择排序的时间复杂度为O(n^2).

1.2 插入排序

算法步骤:

  • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
  • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
    基本的排序算法_第1张图片
    插入排序需要n次插入,每次插入的时间复杂度为O(n),所以算法的时间复杂度为O(n^2)。

1.3 冒泡排序

算法步骤:

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最大的数字被交换到最后一位。
  • 然后再从头开始进行两两比较交换,直到倒数第二位结束。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    基本的排序算法_第2张图片

假设数组含有n个元素,那么一共需要n-1轮操作,每次操作的比较次数为O(n),所以冒泡排序法的时间复杂度为O(n^2)。

1.4 快速排序

快速排序是基于分治法的排序算法的一种,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程都可以递归进行,直到所有数据变成有序序列。

算法步骤:

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
    基本的排序算法_第3张图片
    由于数据每次会分成两部分,每进行一趟快速排序的效率是O(n),所以整体的效率大致是O(nlog2 n)。为了避免把原来有序序列退化,有时需要使用随机取基准,或者每次取开头、中间和结尾3个数之中中间的数为轴。

二、基于统计的排序算法

基于统计的排序算法的时间复杂度可以降低到O(n),统计排序是线性时间排序的一种,线性时间排序一般只能处理整数的排序。

2.1 计数排序

算法步骤:

  • 花O(n)的时间扫描一下整个序列 A,获取最小值 min 和最大值 max
  • 开辟一块新的空间创建新的数组 B,长度为 ( max - min + 1),
  • 数组 B 中 index 的元素记录的值是 A 中某元素出现的次数
  • 最后输出目标整数序列,具体的逻辑是遍历数组 B,输出相应元素以及对应的个数
  • 基本的排序算法_第4张图片
    计数排序中没有用到元素间的比较,利用元素的实际值来确定他们在数组中出现的位置。算法的时间复杂度和空间复杂度都是O(2×n+m)的,其中n为输入数据的个数,m为数据范围。

注意重复值的处理:计数排序之后,输出序列中值相同的元素之间的相对次序与他们在输入序列中的相对次序相同。

计数排序的缺点: 当输入数据的范围比较大是,算法的时间复杂度会比较高,而且又是开辟出长度为m的数组也是比较困难的;另一方面,对于每个可能出现的数都要开辟出一个位置记录,如果输入数据不是整数,对于输入数据的转化映射也会很麻烦。

2.2 基数排序

算法步骤:

  • 将所有待比较数值(正整数)统一为同样的数位长度;
  • 数位较短的数前面补零 从最低位开始,依次进行一次排序;
  • 从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
    基本的排序算法_第5张图片
    基本的排序算法_第6张图片
    参考内容:

程序员吴师兄:https://www.zhihu.com/question/19830721/answer/667233164

你可能感兴趣的:(数据结构算法基础,冒泡排序,基数排序,计数排序,快速排序)