排序算法 -- 插入排序(java)
插入排序的算法思想:
1. 整个数组看成两个数组,一个有序数组(只是包含第一个元素)和一个无序数组(从arr[1]~arr[n])
2. 一轮扫描: 扫描无序数组,把无序数组中的第一个元素插入到有序数组中的适当位置,
3. 扫描n-1轮,每次扫描一轮无序数组中的元素个数减少一个
代码实现:
class Demo {
public static void main(String[] args){
int[] nums = {1,9,5,2};
insertSort(nums);
System.out.println(Arrays.toString(nums));
}
public static void insertSort(int[] arr){
//轮次
for(int i = 1;i < arr.length ;i++){ // 扫描无序数组,从1开始
int insertVal = arr[i];
int insertIndex = i - 1; // 插入的位置在insertIndex+1
while(insertIndex >=0 && arr[insertIndex] > insertVal)
arr[insertIndex+1] = arr[insertIndex]; //元素后移,腾出空间
insertIndex--; //insertIndex--必须在arr[insertIndex+1] = arr[insertIndex]的后面
}
if (insertIndex != i - 1){ // 这里包含了两种情况:1. 在有序数组从右向左扫描找到第一个比该插入元素小的元素,所以insertIndex+1
//就是可以插入的位置 2. 有序数组中从右向左扫描完整个数组 没有比该插入元素小的元素,所以insertIndex =-1,这样该元素插入insertIndex+1 =0 也就是第一个元素
arr[insertIndex+1] = insertVal; // 这里可以优化,判断如果插入的位置就在原地,则不用赋值
}
}
}
}


浙公网安备 33010602011771号