数据结构之七大排序算法
作者:互联网
一、直接插入排序
1、原理
直接插入排序它的整个数组分为两个区间,即无序区间和有序区间
,每次选择无序区间的第一个元素,在有序区间选择合适位置插入。话不多说,下面来看它的代码实现:
2.代码实现
再来分析一下这个排序的性能,最坏时间复杂度o(N),最好时间复杂度o(N^2),那么平均复杂度为o(N^2)。它的空间复杂度为o(1),它是不需要开辟额外的空间的。可以看出,这个排序不会颠倒相同数字得相对位置,我们在排序时选择的是大于等于就放在该数字的右边。所以它是稳定排序。如果一组数基本有序,那么选择插入排序算法效率会更高。
二、希尔排序
1.原理
希尔排序是建立在插入排序的基础上的,它把整个数组分成gap组,然后对每个组进行排序,排好之后再合成一个数组,继续分成gap/2组,重复上述步骤,直到gap=1;然后对整个数组进行插排,得到最终有序数组。
2.代码实现
下面来分析这个排序的性能,它是在插入排序基础上进行了优化,所以它的时间复杂度要比插入排序小,最坏时间复杂度为o(N^2),最好为o(N),平均复杂度为o(N^1.3),空间复杂度为o(1),不属于稳定排序,因为在分组过程中无法保证相同数的相对位置。
三、选择排序
1.原理
每次从无序区间中选出最大的一个元素,存放在无序区间的最后,直到全部待排序的数据全部排完。
2.代码实现
下面分析排序性能,最坏时间复杂度o(N^2),最好时间复杂度o(N),平均时间复杂度o(N^2),空间复杂度o(1),属于不稳定排序。
四、堆排序
1.原理
堆排序也是建立在选择排序的基础上,只不过它是通过建大堆来选择最大的元素,把堆顶元素和堆的最后一个元素交换,再把它放入另外一个数组,然后对堆进行向下调整。
2.代码实现
下面来看算法性能,时间复杂度为o(N*logN),空间复杂度为o(1),堆排序依然属于不稳定排序。
五、冒泡排序
1.原理
冒泡排序也把数组分成两个区间,无序区间[0,array.length-i-1],有序区间[array.length-i-1,array.length],每次按顺序从无序区间取出一个数,把它和后面的数一一进行比较,大数排后面,直到遍历完所有数。冒泡次数为array.length,需要比较的次数为array.length-i-1。
2.代码实现
下面来看算法性能,最坏时间复杂度为o(N^2),最好时间复杂度为o(N),平均时间复杂度为o(N^2),空间复杂度为o(1)。冒泡排序为稳定排序。因为在比较过程中,都是把大于它的数放在后面。
六、快速排序
1.原理
从待排序区间选择一个值,作为基准值,遍历整个待排序区间,将比基准值小的值放在它的左边,比它的值放在右边,左右两个小区间按照同样的方法处理,直到小区间的长度=1,或者长度为0,表示已经全部排好序。
2.代码实现
它的最坏时间复杂度为0(N^2),最好时间复杂度o(NlogN),平均时间复杂度o(NlogN),空间复杂度o(NlogN)。不稳定,可以看出它比前几个排序效率高了很多。
七、归并排序
1.原理
采用分治法,将已有序的子序列合并,先使每个子序列有序,再使每段序列有序,最后合并成一个有序数组。
2.代码实现
该排序算法的时间复杂度为o(NlogN),空间复杂度为o(N),稳定排序。
标签:之七大,排序,数组,插入排序,有序,区间,数据结构,复杂度 来源: https://blog.51cto.com/14632675/2542537