原理图:
Java代码:
class Solution {
public void insertingSort(int[] nums){ //升序
//0到index-1号元素都已经有序,要将index号元素插到它前面的某个位置,以便再次有序
for(int insertedIndex=1;insertedIndex<nums.length;insertedIndex++){
int sortedIndex=insertedIndex-1,insertedNum=nums[insertedIndex];
while(sortedIndex>=0){
if(nums[sortedIndex]<=insertedNum)break;
nums[sortedIndex+1]=nums[sortedIndex]; //所比insertNum更的数后移一位
sortedIndex--; //insertedNum继续向左比较
}
nums[sortedIndex+1]=insertedNum; //因为(nums[sortedIndex]<=insertedNum),所以把insertedNum放到nums[sortedIndex+1]处
}
}
public static void main(String[] args) {
int[] nums={5,6,1,4,2,3,7};
System.out.println("排序前");
for(int i:nums) System.out.print(i+" ");
new Solution().insertingSort(nums);
System.out.println("\n排序后");
for(int i:nums) System.out.print(i+" ");
}
}
总结:
1、每一轮插入可能有多次后移操作;
2、当轮到 i 号元素时(即index=i),前面的0到 i-1 号元素已经有序。于是 i 号元素往前看,遇到比它大的,将其后移;遇到小于等于它的,则在其后定居!