排序算法 -- 插入排序(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; // 这里可以优化,判断如果插入的位置就在原地,则不用赋值 } } } }