七大排序算法

一、直接插入排序
1、原理
直接插入排序它的整个数组分为两个区间,即无序区间和有序区间,每次选择无序区间的第一个元素,在有序区间选择合适位置插入。可以把它看做是大牌游戏,每次摸取一张牌,点数小的自动放前面,大的那个后面。话不多说,下面来看它的代码实现:
2.代码实现
在这里插入图片描述
再来分析一下这个排序的性能,最坏时间复杂度o(N),最好时间复杂度o(N2),那么平均复杂度为o(N2)。它的空间复杂度为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(N2),最好时间复杂度为o(N),平均时间复杂度为o(N2),空间复杂度为o(1)。冒泡排序为稳定排序。因为在比较过程中,都是把大于它的数放在后面。

六、快速排序
1.原理
从待排序区间选择一个值,作为基准值,遍历整个待排序区间,将比基准值小的值放在它的左边,比它的值放在右边,左右两个小区间按照同样的方法处理,直到小区间的长度=1,或者长度为0,表示已经全部排好序。
2.代码实现
在这里插入图片描述
在这里插入图片描述
它的最坏时间复杂度为0(N^2),最好时间复杂度o(NlogN),平均时间复杂度o(NlogN),空间复杂度o(NlogN)。不稳定,可以看出它比前几个排序效率高了很多。
七、归并排序
1.原理
采用分治法,将已有序的子序列合并,先使每个子序列有序,再使每段序列有序,最后合并成一个有序数组。
2.代码实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

该排序算法的时间复杂度为o(NlogN),空间复杂度为o(N),稳定排序。
好了,七大排序算法就讲到这,后序还会推出更多有趣的算法哦。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值