分析思路如下:
插入排序的实现思想是:将数组看作两部分,一部分为有序,另外一部分是无序的,是需要进行排序的部分。将无序的数据一个一个进行遍历,并与有序的元素进行比较,从而进行排序。
以从小到大排序、左边有序,右边无序进行分析:
将右边需要处理的元素取出来,赋值给临时变量temp,如果左边的元素比该数据要大,将左边的元素进行右移,当左边的元素比该数据要小时,停止比较,将该数据插入即可。
示意图如下:
代码实现如下:
private void sort(int[] a){
int left;
//初始条件下默认左边为0的部分的区域是有序的,从1到数组末尾的元素时无序的。
for(int right= 1; right < a.length; right++){
//从第一个元素进行比较,因为该元素后续要进行移动,需要将该元素先取出来赋值给一个临时变量。该元素所在的位置后续可能被其他元素进行填充
int temp = a[right];
//从in开始到最左边的区域都是有序的,相当于一个数组从中间被分开成了两半。左边是有序的,右边是无序的。从左边数组的最右边的那个元素开始进行比较
left = right-1;
//当左边进行比较的元素存在时(left有可能为-1),且该元素比进行比较的元素要大时,该元素进行右移,同时将left--指向下一个需要进行比较的元素
while(left >= 0 && a[left] > temp ){
a[left+1] = a[left];
left--;
}
//执行到该步说明a[left]元素比temp要小,说明temp应该插入的区域为该元素的下一个,即left+1
//另外一种情况是left=-1,此时已经不满足while条件,说明temp应当插入的区域为(left+1),即下标为0
a[left+1] = temp;
}
}