插入排序
插入排序有很多种,这里就例举最简单的一种;插入排序顾名思义,插嘛,怎么插?必然是插入到合适的位置啊!那合适的位置在哪里啊,找啊,怎么找,肯定有判断条件啊。
其实插入排序就对一组无序的数进行排序,它的核心思想是从左到右开始排,类似冒泡排序,小的往左移动,只不过它移动的位置是为了找该数合适的位置,并不是像冒泡排序一样一来最大的数就走到最右边去了,而是每一次都能保证左边都是有序的,那么执行到最后就都是有序的了。
相比于选择排序与冒泡排序,它更加灵活。
直接上代码
public class Insert {
public static void main(String[] args) {
int arr[] = {5,1,6,6,9,8,55,2,3,4,5,7}; //随便定义一个数组
for (int i = 1; i < arr.length; i++) { //从第一个数开始遍历,这层循环看作轮数
int e = arr[i]; //先用一个变量将要判断位置的数存起来
int j = i -1; //因为要移动,i值固定,那就再设置一个变量j
while(j>=0&&e<arr[j]) {//判断左边是否有数,并且后边数是否比前边数小
arr[j+1] = arr[j];//将前面那个更大的数赋值给后面更小的数
j--; //循环,灵活移动
}
arr[j+1] = e; //找到了arr[i]合适的位置,那就可以插入了
}
for (int i = 0; i < arr.length; i++) {//遍历验证
System.out.print(arr[i] + " ");
}
}
}
注意事项:
- 因为外层循环控制轮数,i是从1开始的,因为j=i-1;
- 每一次都应该新建变量去保存当前操作的数arr[i],以及定义变量j,因为j是需要用于移动判断的,值是会改变的。
- 注意while里面的条件(j>=0&&e<arr[j]),这里用了&&,就会有短路问题,比如果如果写成了(arr[i]>e&&j>=0)那么就会报错,因为while循环里面有一个是j--。当j==0,在回到while(arr[j])就会发生数组越界。还有,这里要注意j>=0,不要忽略=号,不然第一个会出问题。
总结
其实三种基本排序都是一样的道理,只不过他们都是操作的顺序不一样,怎么说呢,就是都有遍历查找判断循环,选择是找最值然后交换。冒泡是两两比较交换大小分两边,等遍历到最后就都有序了。而插入就是找到自己的合适定位,放进去就行,就是前移后移的柑橘,冒泡和插入有点像。可以根据条件选择一种排序方法。万变不离其宗,理解不唯一,解法不唯一。