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

概念:

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

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

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

java 复制代码
 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题:

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

java 复制代码
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);
    }
}

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

java 复制代码
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;
        }
    }
}

学生分数的最小差值

java 复制代码
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;
    }
}
相关推荐
励志成为嵌入式工程师36 分钟前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉1 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer1 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
wheeldown2 小时前
【数据结构】选择排序
数据结构·算法·排序算法
观音山保我别报错3 小时前
C语言扫雷小游戏
c语言·开发语言·算法
TangKenny4 小时前
计算网络信号
java·算法·华为
景鹤4 小时前
【算法】递归+深搜:814.二叉树剪枝
算法
iiFrankie4 小时前
SCNU习题 总结与复习
算法
Dola_Pan5 小时前
C++算法和竞赛:哈希算法、动态规划DP算法、贪心算法、博弈算法
c++·算法·哈希算法
小林熬夜学编程5 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法