桶排序(Bucket Sort)(箱排序)
基本思想:设置若干个箱子,依次扫描待排序的记录 array[0],array[1],…,array[n - 1],把关键字等于 k 的记录全都装入到第 k 个箱子里(分配),然后按序号依次将各非空的箱子里的记录收集起来,从而完成排序.桶排序所需要的额外空间取决于关键字的个数,若 array[0…n - 1] 中关键字的取值范围是 0 到 m - 1 的整数,则必须设置 m 个箱子。因此箱排序要求关键字的类型是有限类型,否则可能要无限个箱子。一般情况下每个箱子中存放多少个关键字相同的记录是无法预料的,故箱子的类型应设计成链表为宜。
时间复杂度:
桶排序的平均时间复杂度是线性的,即 O(n)。但最坏情况仍有可能是 O(n ^ 2)。
空间复杂度:
桶排序只适用于关键字取值范围较小的情况,否则所需箱子的数目 m 太多导致浪费存储空间和计算时间。
是否稳定:
稳定
基数排序(Radix Sort)
基本思想:基数排序是对桶排序的改进和推广。如果说桶排序是一维的基于桶的排序,那么基数排序就是多维的基于桶的排序。我这么说,可能还不是太清楚。比方说:用桶排序对 [0, 30] 之间的数进行排序,那么需要 31 个桶,分配一次,收集一次,完成排序;那么基数排序则只需要 0 - 9 总共 10 个桶(即关键字为数字 0 - 9),依次进行个位和十位的分配和收集从而完成排序。基数排序不需要进行记录关键字间的比较,是一种借助于多关键字排序的思想对单逻辑关键字进行排序的方法。
时间复杂度:
基数排序的时间复杂度为 O(n)。
空间复杂度:
基数排序所需的辅助存储空间为 O(n + r * d),其中 r 为记录中关键字分量的最大个数,d 为关键字的个数。比如说:待排序为 0 - 999,那么分量的最大个数为 3,关键字的个数为 10(0 - 9)。
是否稳定:
稳定
快速排序(quick sort)
基本思想:
1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
3.对左右两个分区重复以上步骤直到所有元素都是有序的
时间复杂度:
基数排序的时间复杂度为 O(nlogn)。
空间复杂度:
O(logn)
是否稳定:
不稳定
冒泡排序(BubbleSort)
基本思想:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
时间复杂度:
基数排序的时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。
空间复杂度:
O(1)
是否稳定:
稳定
归并排序(merge sort)
基本思想:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
时间复杂度:
基数排序的时间复杂度为
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)。
空间复杂度:
O(n)
是否稳定:
稳定
插入排序(Insertion sort)
基本思想:
⒈从有序数列和无序数列{a2,a3,…,an}开始进行排序;
⒉处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。用ai与ai-1,a i-2,…,a1进行比较,找出合适的位置将ai插入;
⒊重复第二步,共进行n-i次插入处理,数列全部有序。
时间复杂度:
基数排序的时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。
空间复杂度:
O(1)
是否稳定:
稳定
选择排序(Selection sort)
基本思想:
1.从头到尾扫描序列,找出最小的数与第一个数交换,那么第一次交换后最小的数在第一个位置上。
2.接着对第i个位置上的数,在后续数组中,选最小的与i对换。
3.重复第二步,共进行n-1次交换,数列全部有序。
时间复杂度:
基数排序的时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。
空间复杂度:
O(1)
是否稳定:
不稳定
堆排序(heap sort)
基本思想:
1.首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端
2.将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1
3.将剩余的n-1个数再构造成大根堆,再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组
时间复杂度:
基数排序的时间复杂度为
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)。
空间复杂度:
O(1)
是否稳定:
不稳定
希尔排序(shell sort)
基本思想:
先将待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成),分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
时间复杂度:
基数排序的时间复杂度为
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)。
空间复杂度:
O(1)
是否稳定:
不稳定