插入排序首先想象一个空的数组,将原数列依次向里放,每次放时都先与前一个数比较,如果大于前一个数就直接放后边不需要再比较,如果小就插到该数前边继续向前一个数比较如果还小就继续向前插,直到比前一个数大时停止比较。
例:将 2, 7, 4, 9, 1, 3 按从小到大排列:
先将2插入数组: 2
然后放7,与2比较比2 大直接往后方放: 2 7
放4: 4比7小所以与7交换插到7前边在和2比较比2大不需要再换插到2后边: 2 4 7
放9: 9比7大直接往后放 : 2 4 7 9
放1:先与9比 比9小往前放 再与7比还小继续往前放 因为1最小一直往前直到比完最后一个: 1 2 4 7 9
方3: 先与9比 比9小往前放 与7比也小继续往前放,直到与二比的时候比2大插到2的后边:1 2 3 4 7 9
插入排序算法代码:
/**
插入排序:
想象一个新的数组 先把第一个数放进去,放下一个数时与前一个数比较如果大就继续往后放,如果小继续向前一个数比较 比较到合适位置将其插入
*/
public static void insert(int[] arr){
//外层循环控制插数次数,第一个数直接放入可以少插一次所以length-1;
for(int i=0;i<arr.length-1;i++){
//内次循环控制比较次数 当前插入数依次向前比较;
for(int j=i+1;j>0;j--){
if(arr[j]<arr[j-1]){ //如果遇到比自己大的数就交换位置 ;
exchange(arr,j,j-1); //交换两数位置
}else { //如果比自己小就不需要比较直接跳出拿下一个数;
break;
}
}
}
}
exchange();换位方法,需要交换位置时调用该方法即可:
public static void exchange(int[] arr,int i,int j){
int t=0;
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
总结:插入排序与冒泡和选择相比,冒泡和选择每个数都要和其它数都进行比较依次,相对来数插入算法的比较次数更少,算法更优。