一起学算法(插入排序篇)

概念:

插入排序(inertion Sort)一般也被称为直接插入排序,是一种简单的直观的排序算法

工作原理:将待排列元素划分为(已排序)和(未排序)两部分,每次从(未排序的)元素选择一个插入到(已排序的)元素中的正确位置,这个位置类似于平时打扑克牌摸牌的操作,右手摸牌,根据牌面的大小放到左手边正确的位置上

 具体实现:使用双层循环,外层循环枚举除了第一个元素之外的所有元素,内层循环遍历当前元素前面的有序表,进行待插入位置查找,并进行移动

 public void insertSort(int[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }
        for (int i = 1; i < arr.length; i++) { // 待插入元素的索引
            int insertEle = arr[i];//对待插入元素进行保存
            int j = i - 1;
            //有序区中存在多少个元素就需要遍历多少次
            for (; j >= 0; j--){
                if (arr[j] >= insertEle) {
                    arr[j + 1] = arr[j];
                } else {
                    break;
                }
            }
            //直到找到有序区第一个比待插入元素小的位置,然后在j+1上添加元素
            arr[j + 1] = insertEle;
        }
    }

leetcode题:

删除某些元素后的数组均值

class Solution {
    public double trimMean(int[] arr) {
        if(arr==null||arr.length==0){
            return 0;
        }
        Arrays.sort(arr);
        int count= arr.length/20;
        double sum=0;
        for (int i =count; i < arr.length-count; i++) {
              sum+=arr[i];
        }

        return sum/(arr.length-2*count);
    }
}

去掉最低工资和最高工资后的平均工资

class Solution {
    public double average(int[] salary) {
     insertSort(salary);
     double sum=0;
     for(int i=1;i<salary.length-1;i++){
         sum+=salary[i];
     }
     return sum/(salary.length-2);
    }
     private void insertSort(int[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }
        for (int i = 1; i < arr.length; i++) { // 待插入元素的索引
            int insertEle = arr[i];//对待插入元素进行保存
            int j = i - 1;
            //有序区中存在多少个元素就需要遍历多少次
            for (; j >= 0; j--){
                if (arr[j] >= insertEle) {
                    arr[j + 1] = arr[j];
                } else {
                    break;
                }
            }
            //直到找到有序区第一个比待插入元素小的位置,然后在j+1上添加元素
            arr[j + 1] = insertEle;
        }
    }
}

学生分数的最小差值

class Solution {
    //插入排序
    public void insertSort(int[] nums){
        if(nums==null||nums.length==0){
            return;
        }
        for (int i =1; i <nums.length; i++) {
            int insertEle=nums[i];
            int j=i-1;
            for(;j>=0;j--){
                if(nums[j]>=insertEle){
                    nums[j+1]=nums[j];
                }else{
                    break;
                }
            }
            nums[j+1]=insertEle;
        }
    }

    public int minimumDifference(int[] nums, int k) {
        if (nums.length == 1) {
            return 0;
        }
        insertSort(nums);
        int min=nums[k-1]-nums[0];
        for (int i = 1; i <=nums.length-k; i++) {
            min=Math.min(min,nums[i+k-1]-nums[i]);
        }
        return min;
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃橘子的Crow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值