八大经典排序算法详解:
1、插入
将元素插入到合适的位置,复杂度O(n^2)
2、冒泡
不断比较相邻元素,冒泡排序最好的时间复杂度为O(n):一遍。冒泡排序的最坏时间复杂度为O(n^2):nb遍。因此冒泡排序总的平均时间复杂度为O(n^2)。
3、选择
不断选择最大、最小的元素放在不断增加的位置,复杂度O(n^2)
4、希尔排序:
1)按距离分组,组内进行插入排序
2)减小增量长度,当增量为1时,数组元素全部被排序。
希尔排序不稳定,时间复杂度 平均时间 O(nlogn) 最差时间O(n^2)
5、归并排序
1)将数组分成两个部分,每个部分递归进行归并排序(即会不断拆分,然后将拆分后的部分不断合并,最终得到一个有序数组),也就是将一个很多数据的数组分成前后两部分,然后不断递归归并排序,再合并,最后返回有序的数组。
将待排序的数组分成前后两个部分,再递归的将前半部分数据和后半部分的数据各自归并排序,得到的两部分数据,然后使用merge合并算法(算法见代码)将两部分算法合并到一起。
归并排序的最好、最坏和平均时间复杂度都是O(nlogn),而空间复杂度是O(n),比较次数介于(nlogn)/2和(nlogn)-n+1,赋值操作的次数是(2nlogn)。因此可以看出,归并排序算法比较占用内存,但却是效率高且稳定的排序算法。
6、快速排序
快速排序使用分治法从数列中挑出一个元素,作为 “基准”(pivot)重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
7、堆排序(Heap Sort)
预备知识:
二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。 二叉堆有两种:最大堆和最小堆。 大根堆:父结点的键值总是大于或等于任何一个子节点的键值; 小根堆:父结点的键值总是小于或等于任何一个子节点的键值。 二叉堆一般用数组来表示。
例如,根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2。因此,第0个位置的子节点在1和2,1的子节点在3和4。以此类推。这种存储方式便於寻找父节点和子节点。
堆排序是一种选择排序,其时间复杂度为O(nlogn)。堆排序是不稳定的。
1)构建最大堆;
2)交换堆顶元素和最后一个元素,产生第一个有序区元素,调整最大堆(调整的过程是选择排序)后产生第二个;
3)依次遍历所有元素,产生有序数组。
8、排序
桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
参考资料
1、八大经典排序算法详解 https://zhuanlan.zhihu.com/p/335048580
2、动画图解十个经典排序算法 https://www.sohu.com/a/258291348_291099
3、图文+动画讲解排序算法总结!! https://blog.csdn.net/WantFlyDaCheng/article/details/100645795