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;
}
}