基础排序算法
每次一看算法就是,嗯,看懂了,每次自己写代码就是,嗯?这怎么写?? 本文将自己理解的冒泡排序,插入排序,选择排序三种做一个总结。
冒泡排序
冒泡排序其实很形象,就是每次选最大,或者最小的值,与第一个值交换,逐次冒泡。就像水里面的泡泡,轻的泡泡总会浮起来一样。
实现方式:
1 | int[] a = new int[]{1, 7, 5, 9, 12, 3, 5}; |
假设有原始数组a,每次冒泡的结果就如下,我们这里选的是从大到小冒泡:
1 |
|
冒泡排序的时间复杂度为O(n^2) ; 空间复杂度为O(1);是一个稳定算法。
稳定的意义是指,两个相同的数据,它们排序完之后相对位置不变,比如上面数组的5[a],5[b],排序完之后不会出现5[b],5[a]; a,b为他们的相对位置。
插入排序
插入排序的意思就是有一个数组,你可以假定左边的部分是有序的,这个时候你从右边无序的数据中,找出一个,然后将其插入到有序数据的数组中。
有点类似打扑克,如果一次性将牌发完,你总得给牌排个序吧,比如从左到右,左边第一张你可以假设这一张是有序的,从第二张开始,你就比较一下第二张和第一张谁大,小的就往前面移动,大的就往后面移动。如果是第三张,依次与第二张比,比完再与第一张比。所以第n张就是与n-1比,再与n-2,n-3,…比较,一直比到有一张比它小的,那么这个时候,就位置就对了。看起来就像是我们将第n张牌,插入到了之前有序的一个数组中。
算法实现:
1 | public static void main(String[] args) { |
执行结果:
1 |
|
插入牌的时间复杂度为:O(n^2), 空间复杂度为O(1), 是一个稳定排序算法。
选择排序
选择排序其实就是你拿了一手牌,每次你扫描一遍,拿到最小的那张,把它跟第一张交换下位置。第一次交换第一张位置的,第二次交换第二张位置的,之后依次交换到最后一张。这个咋一看挺像冒泡的,但是远离不相同,冒泡是每次都会有顺移的操作,比如2,3,4,5,1;如果你选了1,它要跟5做比较,交换:2,3,4,1,5;跟4做比较,交换2,3,1,4,5。而选择排序则是:2,3,4,5,1;你先选最小的1,然后跟第一个位置的2做交换变成了1,3,4,5,2,有没有发现,其实只做了一次交换。
代码实现:
1 | public static void main(String[] args) { |
选择排序算法的时间复杂度为:O(n^2);空间复杂度为:O(1); 稳定性为:不稳定。