插入排序
算法过程:
假设一个无序的序列,该算法将其分成两部分,前一部分已经完成排序(有序,一开始时只有一个元素),后一部分任然无序,将后面序列选择第一个插入到前面的有序序列,如此直到所有完全有序。
复杂度:
最简单的即为,整个序列原来即有序,按照一种最“省事”的方式,我们仅需比较n-1次即可。
最复杂的情况,应该说是某种情况操作最多的情况,我们在每次插入时需要比较n-1次,整个排序过程需要比较n*(n-1)/2次,插入n-1次。
按照复杂度计算方法为O(n2次方)
稳定性:
具体的算法还是有点差别的,例如是正序和反序,比较的方向,对于用于比较的关键字相等时候的处理等,但是总能找到一种方法使得整个算法是稳定的,所以该算法是稳定的。
算法关键字:增量
why插入:将后面元素插入到前面有序列。
冒泡排序
算法过程:
将相邻对元素比较,矫正顺序,直到最后,最值留在后面,以此类推。
稳定性:
由于只有相邻才交换,且相等时不交换,所以是具有稳定性。
why冒泡:想气泡一样一个元素一个元素的升上来。
选择排序
算法过程:
如上,每次从待排序序列选择最值与待排序序列的第一个值进行交换(破坏稳定性),直到完成。
算法复杂度:
显然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,而且在第一步中会导致该排序算法不稳定。