import java.util.Arrays; public class Test { public static void main(String[] args) { int[]a={100,5,8,9,2,12,3,89,0,65,5,8,12,1}; a = insetSort(a); System.out.println(Arrays.toString(a)); } /** * 插入排序法:将数组中其中一个数字拿出来,然后跟下一位进行比较,如果比其小就交换位置,接着继续跟下下位比较,一直找到比它大的位数为止,好比扑克牌整理牌那样,取出一个牌通过比较插到对应位置: * 数组:[0,10,6,1,2] * 第一轮:取出0,因为没有前一位,所以不用比,所以第一轮从10开始,10跟0比.比它大,所以不用交换,第一轮完成后,结果为[0,10,6,1,2] * 第二轮:取出6,然后6跟10比,比它小,交换位置,6继续跟下位0比,比它大,第二轮结束后[0,6,10,1,2] * 第三轮:取出1,1跟10比,交换位置,1继续跟6比,交换位置,1最后跟0比,比它大,不用交换,第三轮结束后[0,1,6,10,2] * 第四轮:取出2,2跟10比,交换位置,2跟6比交换位置,2跟1笔,不用交换[0,1,2,6,10],此时比较完毕,也排序完了 * 总结:数组从索引为1起的数都要拿出来,然后跟前面的数据比,直到遇到比它大的为止 * @param arr * @return */ public static int[] insetSort(int arr[]) { if(null==arr || arr.length==0){ return arr; } for (int i = 1; i < arr.length; i++) { //需要取出来插到其他位置的数字 int insertNumber=arr[i]; //下一位的索引 int index=i-1; while (index>=0 && insertNumber<arr[index]){ //如果下一位的索引还没越界(小于0),则取出的数字跟下一位比较,如果小的话,下一位数字就往后移动一位 arr[index+1]=arr[index];//index上的数据往后移动一位,此时取出的数据(insertNumber)可以占用该位置了,因为还要跟下下位比较,所以此处先不写arr[index]=insertNumber index--;//下标继续往下位移动 } arr[index+1]=insertNumber;//当都比较完后,index就是insertNumber的位置了,因为循环里比较完后,index-1了,所以这里要加1,即时没有进入while循环,这里就index+1就是i了,相当于自己赋值给自己 } return arr; } }