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

  

 

posted @ 2021-02-22 00:44  先飞鸟  阅读(135)  评论(0)    收藏  举报