排序算法小结

插入排序

算法过程:

假设一个无序的序列,该算法将其分成两部分,前一部分已经完成排序(有序,一开始时只有一个元素),后一部分任然无序,将后面序列选择第一个插入到前面的有序序列,如此直到所有完全有序。


复杂度:

最简单的即为,整个序列原来即有序,按照一种最“省事”的方式,我们仅需比较n-1次即可。

最复杂的情况,应该说是某种情况操作最多的情况,我们在每次插入时需要比较n-1次,整个排序过程需要比较n*(n-1)/2次,插入n-1次。

按照复杂度计算方法为O(n2次方)


稳定性:

具体的算法还是有点差别的,例如是正序和反序,比较的方向,对于用于比较的关键字相等时候的处理等,但是总能找到一种方法使得整个算法是稳定的,所以该算法是稳定的。

算法关键字:增量

why插入:将后面元素插入到前面有序列。



冒泡排序


算法过程:

将相邻对元素比较,矫正顺序,直到最后,最值留在后面,以此类推。


稳定性:

由于只有相邻才交换,且相等时不交换,所以是具有稳定性。


why冒泡:想气泡一样一个元素一个元素的升上来。

选择排序

初始关键字 [49 38 65 97 76 13 27 49]
第一趟排序后 13 [38 65 97 76 49 27 49]
第二趟排序后 13 27 [65 97 76 49 38 49]
第三趟排序后 13 27 38 [97 76 49 65 49]
第四趟排序后 13 27 38 49 [76 97 65 49 ]
第五趟排序后 13 27 38 49 49 [97 65 76]
第六趟排序后 13 27 38 49 49 65 [97 76]
第七趟排序后 13 27 38 49 49 65 76 [97]
最后排序结果 13 27 38 49 49 65 76 97

算法过程:
如上,每次从待排序序列选择最值与待排序序列的第一个值进行交换(破坏稳定性),直到完成。

算法复杂度:

显然n-1,n-2,,,2,1,全部共有n*(n-1)/2次比较,所以复杂度为n2次方。


稳定性:

该方法之所以用交换应该是考虑空间大小的因素,但是这样也导致稳定性遭到破坏,实际可以进行插入的方法这样可以保证稳定性,但是这样和插入排序没什么区别了。


why选择:选择无序列的最值和本身进行交换


归并排序

算法过程:

先将两个无序列分别用归并排序方法排序,将已排序的序列合并成一个序列。递归,分治。

复杂度:

在分割的过程,复杂度为logn,归并过程为n,总的时间复杂度为nlogn。

稳定性:

具有稳定性,假设关键字相等元素在两个不同的序列,在合并过程中相等时不更改其相对位置即可。


基数排序

今天看到了基数排序,很简单有意思,如下原始数据:

11 54 23 87 36 82 44 

首先按照个位数排序,如下:

11 82 23 54 44 36 87,注意这个算法需要保持稳定性,再对十位数排序,如下:

11 23 36 44 54 82 87,排完啦,显然此处基数为10,转成8进制时,基础可以为8,

还能应用在哪呢 。思考


快速排序

1.首先选择一个key作为中间数字,将整个序列分成两个无序序列(一个比他都大,一个比他都小)(从左到右走一遍 On的复杂度);

2.将这两个无序序列排序(递归,分治);

3.合并之。


所以,算法复杂度就是nlgn,而且在第一步中会导致该排序算法不稳定。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值