由LeetCode排序引起的排序算法总结

1.排序算法总览

冒泡排序、选择排序、插入排序,交换排序,时间复杂度为O(n^2);

快速排序、归并排序、堆排序时间复杂度为O(nlogn);

基数排序、计数排序,划分排序,桶排序,时间复杂度都是O(n)


1.排序算法稳定性与不稳定行比较

   假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且rirj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。


2.不同排序算法性能比较框图

排序算法

平均时间复杂度

最差时间复杂度

额外空间复杂度

稳定性

备注

冒泡排序

o(n^2)

o(n^2)

o(1)

稳定

n小时效果好

选择排序

o(n^2)

o(n^2)

o(1)

不稳定

n小时效果好

交换排序

o(n^2)

o(n^2)

o(1)

不稳定

n小时效果好

插入排序

o(n^2)

o(n^2)

o(1)

稳定

n小时效果好

快速排序

o(nlogn)

o(n^2)

o(nlogn)-o(n)

不稳定

n大时效果好

归并排序

o(nlogn)

o(nlogn)

o(n)

稳定

n大时效果好

堆排序

o(nlogn)

o(nlogn)

o(1)

不稳定

n大时效果好

希尔排序

o(nlogn)

o(ns) 1

o(1)

不稳定

s是所选分组

基数排序

o(logRB)(线性复杂度)

o(logRB)

o(n)

稳定

B是真数(0-9)

R是基数(个十百)

计数排序

o(n)

o(nlogn)   稳定

0

划分排序

o(n)

0

0

稳定

0

桶排序

o(n)

0

0

稳定

0


快速排序空间复杂度解析:快速排序来说,没有申请额外的空间,为什么空间复杂度不是O(1)呢,原来啊,快速排序用了递归来实现,

而递归的话,就造成了栈空间的使用,递归树的深度为(logn),因此快排的空间复杂度为O(nlogn)


堆排序空间复杂度解析:堆排序是就地排序,并没有申请额外的存储空间(最多就是交换时,使用的临时变量),因此空间复杂度为O(1)

2.算法时间复杂度初识

由LeetCode排序引起的排序算法总结_第1张图片

时间复杂度:时间复杂度是指执行算法所需要的计算工作量

空间复杂度:而空间复杂度是指执行这个算法所需要的内存空间

你可能感兴趣的:(leetcode,Java)