tag11:排序 八大经典排序算法

八大经典排序算法详解:

复杂度

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合并算法(算法见代码)将两部分算法合并到一起。

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

你可能感兴趣的:(tag11:排序 八大经典排序算法)