插入排序
如果一个有序的数组,如何进行数据的插入?这个应该很简单,遍历数组然后一个个比较。找到插入位置后,将后面的数据进行后移就可以实现。
那么插入排序的思想也和这玩意一样,只不过区别是它是在本身的数组上进行的拆入。
核心思想就是这张图:
只需要控制区间可以做到,类似新数组的真空地带。例如一开始的9肯定不用动,那么就是7和9之间的比较,那么数组的前两个就是真空区间.一个比较一个平移的动作就完成了这个一个排序中最关键的东西。与其说是移动元素不如说是元素的比较过程。
public void insertionSort(int[] a){ if (a.length<=1){ return; } for (int i = 0; i < a.length; i++) { int num = a[i]; int j = i-1; for (;j>=0;j--){ if (num<a[j]){ a[j+1] = a[j]; } } a[j+1] = num; } }
核心的代码关键就是加粗的部分,j控制了区间,使用--的方法,因为这个区间内的数肯定是有序的,所以从后往前是最好的。而且也之间避免了前面空间的不足,如果是从前往后,需要放入第一位,那么就会很麻烦,后面的依然要进行移动,虽然使用System.copyxxxx这种方法可以很快,但是思想上会稍微麻烦一点。
插入排序三个特点:是原地排序,也可以写成非原地排序。是一个稳定的算法,时间复杂度是O(n²)
smartcat.994