[DataStructure]notes-sort 排序合集

Bubble 冒泡

  • 思想——交换
  • 将每一个元素与它后边的元素相比,如果前面的更大就交换位置。
  • 对于每一个元素来讲,当交换停止时,都满足前面的元素小于它,后面的元素大于它
  • 因此整个数组有序。冒泡排序的平均复杂度是O(N²)。

Insertion 插入

  • 思想——插入
  • 插入排序会维护一个小的有序队列,在排序开始时这个队列的长度是0
  • 此后,每一次将一个新的元素插入这个有序队列中合适的位置,则当全部的元素都插入这个队列时排序完成。
  • 插入排序平均复杂度是O(N²)。

Selection 选择

  • 思想——插入
  • 选择排序则是每一次都遍历所有未排序的元素,从中选出最小的或者最大的元素插入有序队列的头或者尾
  • 平均复杂度同样是O(N²)。

Shell 希尔

  • 思想——特殊的插入
  • 希尔排序与插入排序基本相同,但是在开始时会规定一个增量(一般是数组长度的一半),并且每一趟将这个增量缩小至之前的一半,直至增量变为1。
  • 希尔排序根据增量把每隔N个的所有元素分为同一组,对每一组内使用插入排序。当增量为1时,对整组元素逐个排序。
  • 尽管希尔排序的平均复杂度也是O(N²),但是在实践中一般比插入排序更快(因为每一次处理的都是部分有序的数列,移动元素的次数较少)。

Bucket 桶排

  • 思想——特殊的插入
  • 桶排序则更好的体现了插入的思想,事先将最小值到最大值之间的区间分成N个桶,每个桶涵盖了相同的数据范围。
  • 每次从数组中取出一个元素放入对应的桶内,并将其插入到桶内的所有元素组成的小数组中的合适位置,以此完成排序。最后只需要按顺序把每个桶中的所有元素倒出来就行了。
  • 桶排序对于空间的需求相对较大,但是相应的会减少时间上的需求,平均复杂度我懒得算了,但是可以确定是log级别平方级别之间的,但是在桶划分不合理时会退化到O(N²)。

Quick 快排

  • 思想——分治法
  • 属于最难理解的一个。
  • 快速排序从局部数组中(在第一趟中,这个局部指的是整个数组)随机选取一个中间数,然后将大于它的数全部移动到右边,小于它的数全部移动到左边,再对左右两个局部数组递归进行上述操作,直至在某一趟中每个局部数组都只有一个元素。
  • 在交换结束时,每一个数都满足左边的比它小,右边的比它大,因此整个数组有序。
  • 快排的平均复杂度是O(N*logN),因此叫快速排序,但是在整个数组已经有序时会退化为O(N²)。

Merge 归并排序

  • 思想——分治法
  • 也是上述所有排序法中唯一个外部排序法。
  • 归并排序的基本思想是合并N个有序数组,当N为1时排序完成。
  • 归并排序主要分为两步,第一步把大数据集分成N个小数据集,并使用任意一种内部排序法对每一个小数据集进行排序;第二步是每次将其中的K个已经有序的小数据集进行合并(称为K路归并)。
  • 归并排序的平均复杂度是O(M_N_logN),其中M为每个小数据集中数据的个数,N为小数据集的数量,log的底数为K

Radix 基数排序

  • 最无聊的一种排序法。
  • 假设有一个数据集是{456, 123, 789},基数排序先比较个位数字并排列有序,再比较十位数字并排列有序,最后比较百位数字并排列有序。
  • 人类在查找纸质字典的目录时就是在进行基数排序。
  • 基数排序不太容易衡量复杂度,也不太可能考。
上一篇:TypeScript notes


下一篇:LeetCode Notes_#705_设计哈希集合