插入排序
排序原理:
是通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到相应的位置并插入.插入排序在实现上,再从后往前扫描过程中,需要反复把已排元素逐步向后挪位,为最新元素提供插入空间.
过程分析:
-
首先我们选定一个索引,假设其左边元素是有序的,用索引上元素和它左边的元素从右往左比较.
-
如果左边的元素大于取出的元素,那么将这个元素右移一位,此时2已经比到最左边停止比较,将2 空位上,再将空位索引右移.
-
经过上步得到下面的结果,这时空位左边两个元素已经有序了,再将空位元素取出,向左比较.遇到大的将其右移一位,遇到小的停止比较,将6放在空位上.
-
经过上一步得到结果如下.
-
这时空位上取出元素为5,依次和左边元素比较.直至遇到小于5的数,或者到了最左边.
-
经过上面处理,已经有5个元素有序.
代码实现:
public class Test3 {
public static void main(String[] args) {
int [] arr = {9,2,6,7,5,8,4,1};
//外层向右的index,即作为比较对象的数据的index
for(int i = 1; i<arr.length; i++){
//用作比较的数据
int temp = arr[i];
int j = i-1;
//当比到最左边或者遇到比temp小的数据时,结束循环
while(j>=0 && arr[j]>temp){
arr[j+1] = arr[j];
j--;
}
//把temp放到空位上
arr[j+1] = temp;
//打印每次内层循环完结果
System.out.println(Arrays.toString(arr));
}
System.out.println(Arrays.toString(arr));
}
}
结果:
[2, 9, 6, 7, 5, 8, 4, 1]
[2, 6, 9, 7, 5, 8, 4, 1]
[2, 6, 7, 9, 5, 8, 4, 1]
[2, 5, 6, 7, 9, 8, 4, 1]
[2, 5, 6, 7, 8, 9, 4, 1]
[2, 4, 5, 6, 7, 8, 9, 1]
[1, 2, 4, 5, 6, 7, 8, 9]
[1, 2, 4, 5, 6, 7, 8, 9]
小结:
选取一个索引A,假设其左边元素是有序的,将其拿出来,这时数组就会出现一个空位,
我们将取出来的元素与他左边元素从右往左比较,遇到比它大的,那么将这个元素右移一位,
如此下去,直到取出的元素遇到比它小或者比到了最左端,即停止,再将取出元素放回当前空位(即符合它的插入位置),
同时A索引右移一位.这样一轮下来,索引左边的元素就是有序的按照这种思想下去就可以完成排序.