前几日,我在看插入排序的时候,书上对于插入排序的说明,它举了个例子,原话:“通常人们在整理牌的时候的方法是一张一张的来,将每一张牌插入到已经有序的牌中的适当位置,在计算机的实现中,为了给要插入的元素腾出空间,我们需要将其余所有元素在插入之前都要右移一位。”。
emmmmmm................
很好,这本书成功地把我这个新手绕晕了,我想,摸牌的时候一张张摸到,然后插入到相对应的位置,但是在开始摸牌的时候我手里是没有牌的,难道要定义一个新的数组?
然而,后来发现我理解错误了。
想象一下你摸完牌把你手里的牌都摊开放在桌子上,然后从左至右或者从右至左依次将牌一张张与前面已经整理好的牌做对比,将牌插到对应位置(不喜欢按升序,降序整理的除外)之后就可以将手里的牌整理成有序的。
原理:
将数组(arr)划分为两部分,前一部分有序,后一部分无序,将后一部分第一个数组的元素(a)与前一部分有序的数组进行比较,若是该元素小于有序部分的元素,则将有序部分的那个元素往后移一位,并将之前a插入到相对应位置。循环多次直到数组比较结束,但在实际的运用当中,我们通常遇到的情况都是无序的,不存在有序部分,因此我们通常将arr[0]视为已经有序了的
灵魂画手大致演示一下实现阶段:
emmmm.....
不要在意绘图水平。
上代码:
package work.soft.sort;
import java.lang.reflect.Array;
public class InsertSort {
public static void main(String args[]) {
int [] arr = {15,87,45,35,47,2,8,4,226,147,246,342,46};
int save = 0;//定义一个save值,待会用来存储本次循环需要与其他元素对比的元素
int j = 0;//内层循环的控制变量
for(int i = 1;i<arr.length;i++) {
save = arr[i];//存储本次循环需要与其他元素对比的元素
for( j= i-1;j>=0;j--) {
//以j为下标的元素,我们认为它已经是排好了序的。
//并对比save若是存在排序中的元素比第一个未排序的元素
//若是排了序的元素中有比save大的就将该元素后移一位
//并将save的值赋予arr[j]
if(arr[j]>save) {
arr[j+1] = arr[j];
arr[j] = save;
}
}
}
//遍历输出数组
for(int i = 0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
}